小编alm*_*now的帖子

递归块中的ARC行为

我已经制作了这两个实用功能:

+ (void)dispatch:(void (^)())f afterDelay:(float)delay {
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay*NSEC_PER_SEC)),
                    dispatch_get_main_queue(),
                    f);
  }

+ (void)dispatch:(void (^)())f withInterval:(float)delay {
    void (^_f)() = nil; // <-- A
    _f = ^{
        f();
        [self dispatch:_f afterDelay:delay]; // <-- B
    };
    [self dispatch:_f afterDelay:delay];
}
Run Code Online (Sandbox Code Playgroud)

这个想法是你可以打电话:

[self dispatch:block afterDelay:delay ]; - 在特定时间后执行块

和

[self dispatch:block withInterval:delay ]; - 定期执行块

好了,如果我调用dispatch:withInterval : ,因为它会在运行时创建一个错误,因为当程序试图在B处执行行时,_f的值将为nil ; 而这又是因为_f保持对所述的值的基准_f在甲.

如果我将A更改为:

__block void (^_f)() = …
Run Code Online (Sandbox Code Playgroud)

objective-c objective-c-blocks automatic-ref-counting

5
推荐指数
1
解决办法
588
查看次数

C++错误:必须调用对非静态成员函数的引用

我正在尝试创建一个类来抽象libuv的网络功能的一些基本行为.

#define TCP_BACKLOG 256
class _tcp {
    uv_tcp_t* tcp = NULL;
    public:
    ~_tcp() { delete tcp; }
    void listen_uv_listen_uv_connection_cb(uv_stream_t* stream, int status) {
        printf("NEW CONNECTION\n");
    }
    void listen(const char* host, int port) {
        tcp = new uv_tcp_t();
        uv_tcp_init(uv_default_loop(), tcp);
        sockaddr_in* addr = new sockaddr_in();
        uv_ip4_addr(host, port, addr);
        uv_tcp_bind(tcp, (const sockaddr*)addr, 0);
        delete addr;

        uv_listen((uv_stream_t*)tcp, TCP_BACKLOG, listen_uv_listen_uv_connection_cb);
    }
};
Run Code Online (Sandbox Code Playgroud)

以前显示的代码的问题是,当我尝试编译它时,我收到以下错误:

error: reference to non-static member function must be called
  on: uv_listen((uv_stream_t*)tcp, TCP_BACKLOG, listen_uv_listen_uv_connection_cb);
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

它指出listen_uv_listen_uv_connection_cb了罪魁祸首.

有人可以向我解释,为什么这是一个错误,我该如何解决?

在uv_listen()和 …

c++ libuv

5
推荐指数
1
解决办法
1万
查看次数

跨平台跨语言跨一切实际确定性随机数生成器

我正在寻找一种从给定种子生成随机数的算法,但有一个特殊要求,即无论底层计算机体系结构或语言实现如何,它都将始终生成相同的数字序列。

我已经知道 Mersenne Twister,但是,当使用不同的实现(即 C MT 与 Javascript MT)时,它生成的数字会有所不同。

是否存在具有此属性的算法?另外,我不需要最先进的 RNG,我什至不需要它是加密安全的,我只想在一个地方驱动一个“随机”模拟并让它遵循相同的行为不同的实现。

random cryptography prng

5
推荐指数
1
解决办法
614
查看次数

IndexedDB - keyPath 已经是索引了吗?

一个简单的问题。

当您创建 IndexedDB 并指定特定的 时keyPath,您是否仍然需要使用相同的键创建和索引?

我认为它keyPath本身就是一个索引,但我不知道也没有找到任何有关它的信息。

编辑:好的,澄清一下,我的意思是,您是否在具有 keyPath 的索引上获得了性能优势?

indexeddb

5
推荐指数
1
解决办法
1792
查看次数

Javascript中的操作执行顺序是否始终保持相同?

当我做这样的事情时:

var x = 5;
console.log(         x  + (x += 10)  );  //(B) LOGS 10, X == 20
console.log(  (x += 10) +  x         );  //(A) LOGS  0, X == 30
Run Code Online (Sandbox Code Playgroud)

(A)和(B)之间的返回值的差异由其x评估时的值来解释.我认为后台应该发生这样的事情:

     TIME ---->
(A)         (x = 5) + (x += 10 = 15) = 20
(B) (x += 10 == 15) + (x == 15)      = 30
Run Code Online (Sandbox Code Playgroud)

但是这只有在且仅当它以与写入x的相同的从左到右的顺序进行评估时才成立.

所以,我有几个问题,

对于所有Javascript实现,这保证是否正确?

是否按标准定义了这种方式?

或者,这是Javascript世界中某种未定义的行为吗?

最后,同样的想法可以应用于函数调用,

var x = 5;
console.log(x += …
Run Code Online (Sandbox Code Playgroud)

javascript language-lawyer

5
推荐指数
1
解决办法
74
查看次数

C预处理器,宏"重载"

我正在尝试做某种宏"重载",以便MACRO(某些东西)的扩展方式与MACRO(其他东西)不同.

使用我从这里得到的片段(我不确定它是否100%便携)和Boost PP库中的一些功能,我能够使它工作:D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
                  BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
                  BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + …
Run Code Online (Sandbox Code Playgroud)

macros c-preprocessor variadic-macros boost-preprocessor

4
推荐指数
1
解决办法
5726
查看次数

GNU sort - 用于比较的默认算法是什么?

我需要帮助理解 GNU 排序的默认算法。我认为它进行了字典排序,但是我发现了一些与此不符的行为,例如以下字符串:

alex.
alex.a
alex.Z
alexa
alex0
alexZ
alex.~
alex
alex.|
alex.}
alex.abc
Run Code Online (Sandbox Code Playgroud)

并使用类似的排序在外壳上对它们进行排序 echo 'stuff' | sort

这是我得到的结果:

alex
alex.
alex.~
alex.|
alex.}
alex0
alexa
alex.a
alex.abc
alexZ
alex.Z
Run Code Online (Sandbox Code Playgroud)

我想不通为什么alex0和alexa之间出现在alex.}和alex.a

谁可以给我解释一下这个?

linux sorting gnu gnu-sort

2
推荐指数
1
解决办法
2277
查看次数

After Effects(Mac)从终端执行脚本

我正试图弄清楚如何从命令行执行After Effects脚本.

官方文件说:

Example (for Windows):
afterfx -r c:\script_path\example_script.jsx
Run Code Online (Sandbox Code Playgroud)

没有什么适合Mac的.但是我正在尝试:

open -b com.adobe.AfterEffects --args -r /script_path/example_script.jsx
Run Code Online (Sandbox Code Playgroud)

没有任何反应.程序虽然打开了,但似乎从未调用过该脚本.

有谁想过这个?

macos terminal scripting adobe after-effects

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

不同类型的C++映射赋值重载

我有一个继承自unordered_map的自定义类,如下所示:

class _map : public unordered_map<string, _pointer> {
    public:
    // STUFF ...
};
Run Code Online (Sandbox Code Playgroud)

让我们假设这_pointer是另一个自定义类,它的作用是帮助我处理指针的东西._pointers可以从许多不同的预定义类型构造,例如:

vector<...> v;
_pointer p = _pointer(v);
// p is now a _pointer holding v and vector<...> data
Run Code Online (Sandbox Code Playgroud)

现在,如果我想_pointer在我的地图上存储vector <...> ,我可以简单地做:

_map map;
vector<...> v;
map["a_vector"] = _pointer(v);
Run Code Online (Sandbox Code Playgroud)

它有效,但我希望能够做到这一点:

_map map;
vector<...> v;
map["a_vector"] = v;
Run Code Online (Sandbox Code Playgroud)

并将它_pointer(v)自动分配,也许通过重载map如何分配东西并明确告诉它vector<...>通过调用特定的_pointer构造函数来处理它.

我试图这样做(通过重载operator [],operator =)但似乎我不会去某个地方.任何人都可以建议我实现这种行为的方法吗?

谢谢.

常问问题:

问:为什么在标识符名称上使用_?难道你不知道这是不好的做法吗?
答:手头的问题无关紧要.

问:您的代码不是RAII.
A:那么,什么?

问:你为什么不使用unique_ptr/smart_ptr?你为什么直接处理指针?
答:因为我需要,而且对于手头的问题也无关紧要.

问:你为什么要重载unordered_map?你为什么不用这个_OTHER_OPTION_?
答:不,谢谢,这是我需要做的.

c++ unordered-map overloading operator-overloading

0
推荐指数
1
解决办法
1813
查看次数