2011-07-06 19 views
6

私はRunge-Kutta法を用いて結合されたマスター方程式の大きな集合のダイナミクスを計算するコードを書いています。このコードには、各ステップが独立している多くのfor-loopが含まれています。 Grand Central Dispatchを使用してプログラムをスピードアップするつもりです。私はhttp://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-centralにある例に基づいて試みました。私のコードもmacresearchの例も私のマシンではコンパイルされません(MacOSX 10.6.8 Xcode 4.0.2)。だからここに私のコードです:dispatch_apply(GCD)ループから配列に書き込む方法は?

... 
    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  
            } 
         ); 
... 

それはエラーで破る:

Semantic Issue: Cannot refer to declaration with a variably modified type inside block

私はベクターで配列(値、K1)を交換しようとしたが、その後、私は代わりに別のエラーメッセージが表示されます。

Semantic Issue: Read-only variable is not assignable

これは私が立ち往生しているところです。本当にそのエラーメッセージが私に伝えようとしていることは分かりません。私はかなりの時間を探して、誰かが助けることができるかどうか尋ねる。私はこの問題を解決するためのヒントやより良い方法に非常に感謝しています。

答えて

14

error: cannot refer to declaration with an array type inside block

ブロック実装では、ブロックからC配列にアクセスすることはできません。私は__block指定子を追加するにはどうすればよい

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

ありがとう!それは問題を解決するようだ! – Jofro

1

キャプチャされた変数に格納するには、その宣言に__block記憶指定子を追加する必要があります。それはあなたが見ているstd::vector問題を修正するはずです。

可変的に変更されたタイプの問題は、可変長配列を使用しているように聞こえます。これらはブロックのコンテキスト(基本的にはカスタムC structタイプ)に確実にコピーできないため、ブロック内から参照することはできず、コンテキストを操作するときにはoffsetofスタイルの計算を混乱させる可能性があります。この問題を解決するには、固定サイズの変数(必要な最大サイズを使用する)、配列をグローバル/静的ストレージに移動する、またはポインターを割り当ててポインタ算術を実行して2次元にアクセスします。

+0

:-)簡単な修正はあり

(私は...それについてのドキュメントを見つけることができません)。 Xcodeドキュメントのdispatch_applyに関連する例がありますが、それは動作しません。 (私はそれについて不平を言う人のチケットを見つけました)\t \t 私はエラーメッセージを理解できなかったので、私は配列のサイズを変更しません。 \t \t とにかく私は坂本の回避策を使用していました。しかし、助けてくれてありがとう! – Jofro

関連する問題