Как записать в массив из цикла dispatch apply (GCD)?

Я написал код для вычисления динамики большого набора связанных главных уравнений с использованием метода Рунге-Кутты. Кодекс содержит множество циклов, где каждый шаг является независимой. Я намерен использовать 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      
                                    }
                        );
...

он ломается с ошибкой:

семантическая проблема: не может ссылаться на объявление с изменяемым введите внутри блока

Я попытался заменить массивы (значения, k1) векторами, но вместо этого я получаю другое сообщение об ошибке:

семантическая проблема: переменная только для чтения не присваивается

вот где я застрял, не зная, что это за ошибка сообщения пытаются сказать мне. Я провожу довольно много времени в поисках и спрашиваю, Может ли кто-нибудь помочь. Я был бы очень благодарен за советы или лучшие способы решить эту проблему.

2 ответов


ошибка: не может ссылаться на объявление с типом массива внутри блока

при реализации блоков доступ к массиву C из блоков запрещен. (Я не могу найти документацию об этом...)

есть простое исправление: -)

double valuesArray[SpaceSize], k1Array[SpaceSize];    
double *values = valuesArray, *k1 = k1Array;

чтобы сохранить в захваченную переменную, вам нужно добавить __block спецификатор хранилища для его объявления. Это должно исправить std::vector проблема, которую вы видите.

проблема с изменяемым типом заставляет звучать так, как будто вы используете массив переменной длины. На них нельзя ссылаться изнутри блоков, потому что они не могут быть надежно скопированы в контекст блока (в основном пользовательский C struct type), и они могут испортить offsetof-стиль расчетов при работе с контекст. Вы можете решить эту проблему, работая с переменной фиксированного размера (просто используйте максимальный размер, который вам понадобится), перемещая массивы в глобальное/статическое хранилище или выделяя указатель и выполняя арифметику указателя для доступа ко второму измерению самостоятельно.