小编mur*_*att的帖子

是浮点==还好吗?

就在今天,我遇到了我们正在使用的第三方软件,在他们的示例代码中,有以下几点:

// Defined in somewhere.h
static const double BAR = 3.14;

// Code elsewhere.cpp
void foo(double d)
{
    if (d == BAR)
        ...
}
Run Code Online (Sandbox Code Playgroud)

我知道浮点数及其表示的问题,但它让我想知道是否有float == float可能会好的情况?我不是在问它什么时候可行,而是在它有意义和有效的时候.

还有,电话foo(BAR)怎么样?它总是比较相同,因为它们都使用相同的static const BAR吗?

c++ floating-point comparison

52
推荐指数
6
解决办法
3026
查看次数

struct/class中静态常量的奇怪未定义符号

要么我非常疲倦,要么发生一些我不知道的奇怪事情,因为下面的代码在链接时导致Foo :: A和Foo :: B的未定义符号.这可以从一个更大的项目中尽可能地减少,但显示了我正在看的内容的本质.

#include <algorithm>

struct Foo
{
    static const int A = 1;
    static const int B = 2;
};

int main()
{
    return std::min(Foo::A, Foo::B);
}
Run Code Online (Sandbox Code Playgroud)

没有std :: min函数模板它工作正常,即只返回Foo :: A. 在类/结构之外定义静态int时也很好(在这个简单的例子中是全局的).但是,只要他们像这样,链接器就找不到它们.

有人能解释发生了什么吗?

c++ initialization definition static-members undefined-symbol

32
推荐指数
1
解决办法
9959
查看次数

用于线程控制的volatile bool被认为是错误的吗?

由于我对这个问题的回答,我开始阅读关键字volatile以及关于它的共识.我看到有很多关于它的信息,一些旧的现在看起来是错的,而且很多新的说它在多线程编程中几乎没有位置.因此,我想澄清具体的用法(在SO上找不到确切的答案).

我还想指出我一般都理解编写多线程代码的要求,以及为什么volatile不解决问题.不过,我看到代码volatile用于我工作的代码库中的代码.此外,这是我使用volatile关键字的唯一情况,因为所有其他共享资源都已正确同步.

假设我们有一个类:

class SomeWorker
{
public:
    SomeWorker() : isRunning_(false) {}
    void start() { isRunning_ = true; /* spawns thread and calls run */ }
    void stop() { isRunning_ = false; }

private:
    void run()
    {
        while (isRunning_)
        {
            // do something
        }
    }
    volatile bool isRunning_;
};
Run Code Online (Sandbox Code Playgroud)

为简单起见,有些事情被遗漏了,但重要的是创建了一个对象,它在新生成的线程中执行某些操作,检查a(volatile)布尔值以了解它是否应该停止.只要希望工作者停止,就会从另一个线程设置此布尔值.

我的理解是,volatile在这种特定情况下使用的原因只是为了避免任何将其缓存在循环寄存器中的优化.因此,导致无限循环.没有必要正确地同步事物,因为工作线程最终将获得新值?

我想知道这是否被认为是完全错误的,如果正确的方法是使用同步变量?编译器/架构/核心之间有区别吗?也许这只是一个值得避免的草率方法?

如果有人澄清这一点,我会很高兴.谢谢!

编辑

我有兴趣看到(在代码中)你如何选择解决这个问题.

c++ multithreading multicore volatile

27
推荐指数
4
解决办法
2万
查看次数

动态添加tabindex

我想将tabindex添加到所有表单元素.表单是动态的,我无法将其添加到HTML中.我想将它作为一个函数运行.如果有多个具有相同名称的单选按钮,则每个单选按钮都必须具有自己的tabindex值.页面上的大多数表单元素都以INPUT开头,SELECT除外.我该如何解释?

我想我需要运行一个循环并添加属性,对吧?

var n = 1; 

$('input, select').each(function() {               
    $(this).attr('tabindex', n++);
});
Run Code Online (Sandbox Code Playgroud)

jquery

25
推荐指数
2
解决办法
6万
查看次数

在MacOS/Linux上替换MS _vscprintf?

作为一种学习经历,我将一些东西从Windows移植到MacOS,并遇到这样的事情:

void SomeClass::someFunction(const char* format, va_list args)
{
    int size = _vscprintf(format, args); // length after formatting
    std::string s;
    s.resize(size);
    vsprintf(&s[0]);
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,因为_vscprintf是微软特有的,我在Linux上没有发现任何类似的东西,我想我会问这里.

我们还假设此代码位于某个关键路径中,并且不应该有一些额外的堆分配开销等.

在MacOS/Linux上推荐的_vscprintf替代品是什么?

谢谢!

c++ string

16
推荐指数
2
解决办法
9166
查看次数

如何正确导入Golang appengine?

在用Go编写的Google App Engine项目中,我一直在使用eg

import "appengine/datastore"
Run Code Online (Sandbox Code Playgroud)

很长一段时间成功并假设导入找到了我有App Engine SDK的地方.但是,现在我想使用来自Google的第三方库,它也使用App Engine中的东西,但是使用完整路径导入:

import "google.golang.org/appengine"
Run Code Online (Sandbox Code Playgroud)

运行应用程序

$ goapp serve
Run Code Online (Sandbox Code Playgroud)

失败,没有找到appengine:

...go/src/golang.org/x/oauth2/client_appengine.go:16: can't find import: "google.golang.org/appengine/urlfetch"

Can't find package "google.golang.org/appengine" in $GOPATH
Run Code Online (Sandbox Code Playgroud)

显然我想使用相同的App Engine部件来解决其他问题.我的第一个通道是我想告诉第三方库使用App Engine SDK库,但我不知道它在导入中有不同的前缀.

我应该在项目中使用所有App Engine导入的完整路径吗?这与我在谷歌针对Golang网页的App Engine上所阅读的内容完全相反.比如这里.

一般来说,设置东西的方式是什么,以便在App Engine和第三方库的开发和生产中找到合适的appengine库?

在此先感谢您的帮助!

UPDATE

我还可以看到,在添加第三方库并运行go get它之后,将所有类型的东西都输入$GOPATH/src/google.golang.org/api/....那里有很多东西和appengine等等.似乎是所有Golang Google API ......!

所以它没有得到解决,但我了解到有一个变化会改变为完全合格的appengine导入路径.

现在我的应用程序在本地运行,因为我引入了新的appengine以满足使用新导入路径的oauth库.

go get google.golang.org/appengine
Run Code Online (Sandbox Code Playgroud)

根据这个:

如果您不想更新整个应用程序以使用新的App Engine软件包,则可以并行使用两组软件包,仅使用带有oauth2软件包的新软件包.

实际上非常令人困惑,我不知道在App Engine上部署时可用的内容.有人知道吗?

google-app-engine dependencies go

16
推荐指数
1
解决办法
5829
查看次数

使用铅笔在iPad Pro上注释表格视图

我正在为iPad Pro构建一个应用程序,它有一个UITableView,显示带有项目的目录.有许多目录,每个目录有1千件物品.

目标

我想知道如何(最好)使用Pencil在UITableView中注释东西,以便用户可以用手指滚动.此外,用户绘制的内容将保留在数据模型中.

让我解释一下我的尝试.

单UIView

我在一个自定义的UITableView上放置了一个UIView,它覆盖了touchesBegan/Moved/Ended/Canceled函数和过滤器,touch.type == UITouchType.Stylus以便知道它何时是手指以及何时是铅笔.这是有效的,但它不是一个好的解决方案,因为图像将是巨大的,甚至不可能为一些目录与太多的项目.

每行一个UIView

适用于大型目录,但是出现了无法跨越必须可行的行的问题.我还没有找到一种方法来保持手势跨越不同的视图.这可能还是有某种解决方法?

在屏幕上修复了UIView

滚动时跟随,易于绘制任何东西,但不清楚和难以将绘制的东西固定到表格坐标以及坚持它.它感觉不对,因为它看起来过于复杂,可能要跟随屏幕尺寸的画布,任何绘制的东西都会转换为UIImageView,用于它跨越并保持在那里的行......这就是我现在的位置,我可以展示一些代码,如果这种方法有意义.

有没有更好的方法,因为在我看来这应该是一个非常自然的需要现在使用铅笔,即注释和持久在表格视图中.

有没有人做过这样的事情或者有什么我忽略的东西?也许是某种稀疏的UIImageView,所以我可以在一张巨大的桌子上有一个?

我正在寻找一个好的解决方案和示例代码,具体取决于解决方案的相关程度.

谢谢!

UPDATE

因此,为了澄清,表中的项目是以固定方式排序的,因此可以使用它来将绘制/注释的内容保持为部分.

通常,图纸/注释可以保持为从1到N个图像的任何东西.一个图像在很多情况下太大,因为项目数千,N图像意味着存在手势被中断的边框,并且由于绘图不连续而不适用于可用性(除非这可以解决哪个会很棒).

数据模型可以是目录[ - >页面] - >项目,但我不希望有一个页面概念,因为它(更长的原因)使每页的项目更小,整个点是最大化项目到它更容易注释.

uitableview ipad ios

10
推荐指数
1
解决办法
255
查看次数

具有相同名称的对象文件的静态库(ar)

有点背景.假设我有源文件,需要最终在静态库中.假设有两个cpp文件a.cpp,a.cpp位于两个不同的子目录中.像这样的东西:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp
Run Code Online (Sandbox Code Playgroud)

他们的内容没有冲突,完全不同.文件名是一样的.

现在,在编译时我a.o当然最终得到了两个文件.

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o
Run Code Online (Sandbox Code Playgroud)

如果我现在创建一个静态库

ar rcs libfoobar.a foo/a.o bar/a.o
Run Code Online (Sandbox Code Playgroud)

我可以看到静态库中的两个文件都在运行nm libfoobar.a.看起来很好.

问题

我可以看到的问题是,如果我运行ar单个命令foo/a.o,并bar/a.o把它们放在同一个静态库.现在后一个对象文件将覆盖前者,所以在运行时nm libfoobar.a我只看到库中的后一个对象.我猜这是因为相同的目标文件名.

在创建静态库的时候ar,我是否应该总是将所有对象组合在一起,或者也可以ar多次运行,一次收集一部分对象,所有这些都在同一个静态库中?在这个例子中,我可以看到前者的作品,但不能看到后者.

当一个人a.cpp改变并且静态库需要改变时,它将如何工作?会在图书馆ar找到a.cpp改变的权利吗?

这只是一个小例子,但考虑一个包含许多文件的大型项目,其中一些具有相同的名称.如果您现在想要创建一个库,您也可能会遇到这种情况.

一般来说,这只是组织库的组织方式,文件的命名方式或是否有其它东西可以使事情有效?

c++ linker static-libraries unix-ar

9
推荐指数
1
解决办法
6287
查看次数

从多线程获取单例实例的安全方法

方法1

DataCenter* DataCenter::getInstance()
{
    static DataCenter instance;
    return &instance;    
}
Run Code Online (Sandbox Code Playgroud)

方法2

DataCenter* DataCenter::getInstance()
{
    if (!m_instanceFlag)
    {
        m_instance = new DataCenter();
        m_instanceFlag = true;
    }    
    return m_instance;      
}
Run Code Online (Sandbox Code Playgroud)

我正在进行多线程编程,DataCenter将由多个线程访问.我曾经有方法2来获取DataCenter的实例,它工作正常.但我注意到我需要保护单例实例不被多线程调用.

我的问题是,我真的需要保护单例实例吗?或OS是否为我这样做?第二个问题是,第一种方法是获得单例实例的正确方法吗?

提前致谢...

c++ multithreading

9
推荐指数
1
解决办法
4240
查看次数

静态,非成员或静态非成员函数?

每当我有一些朝向"效用"方向的功能时,我最终想知道哪个选项是最好的.例如,在我工作的上下文中打印消息结构(自己的或外部的),一些编码/解码代码或简单的一些有用的转换函数.

我想到的选项是:

1)helper类/ struct中的静态函数.

struct helper
{
    static bool doSomething(...);
};
Run Code Online (Sandbox Code Playgroud)

2)非成员函数.

namespace helper
{
    bool doSomething(...);
}
Run Code Online (Sandbox Code Playgroud)

3)静态非成员函数.

namespace helper
{
    static bool doSomething(...);
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,可能需要在"实用程序"中初始化或保持状态,因此我选择选项1以避免"全局"状态.但是,如果没有需要保留的状态,我应该选择2还是3?选项2和3之间的实际区别是什么?

重要的是要考虑什么,是否有一种首选的方法来解决这个问题?谢谢!

c++ static non-member-functions

8
推荐指数
2
解决办法
4312
查看次数