如何从dispatch_apply(GCD)循环写入数组?

Jof*_*fro 6 c++ macos concurrency grand-central-dispatch

我编写了使用Runge-Kutta方法计算大量耦合主方程的动力学的代码.代码包含许多for循环,其中每个步骤都是独立的.我打算使用Grand Central Dispatch加速该计划.我的尝试基于我在http://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-central找到的一个例子.我的代码和macresearch上的示例都没有在我的机器上编译(MacOSX 10.6.8 Xcode 4.0.2).所以这是我的代码:

...
    double values[SpaceSize], k1[SpaceSize];    

        for ( int t=1 ; t<Time ; t++ ) {

            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

            //k1
            for (int k=0 ; k<SpaceSize ; k++ ) values[k]=Concentration[k][t-1];

            dispatch_apply(SpaceSize, queue,
                       ^(size_t k)  {
                           k1[k]=h * derives(values, SpaceSize, k); //<--error      
                                    }
                        );
...
Run Code Online (Sandbox Code Playgroud)

它打破了错误:

语义问题:不能在块内引用具有可变修改类型的声明

我尝试用向量替换数组(值,k1),但后来我得到另一个错误消息:

语义问题:只读变量不可分配

这就是我被困住的地方,并不知道这些错误消息试图告诉我的是什么.我花了很长时间搜索并询问是否有人可以提供帮助.我会非常感谢提示或更好的方法来解决这个问题.

Kaz*_*oto 14

错误:无法在块内引用数组类型的声明

在块实现下,不允许从块访问C数组.(我找不到关于它的文档......)

有一个简单的解决方法:-)

double valuesArray[SpaceSize], k1Array[SpaceSize];    
double *values = valuesArray, *k1 = k1Array;
Run Code Online (Sandbox Code Playgroud)