2011-07-06 54 views
6

我已經編寫了代碼來計算使用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)。因此,這裏是我的代碼:如何從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數組。 (我無法找到關於它的文檔......)

有一個簡單的辦法:-)

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

非常感謝!這似乎解決了這個問題! – Jofro

1

要存儲到捕獲的變量中,您需要將__block存儲區分符添加到其聲明中。這應該可以解決您看到的std::vector問題。

可變修改類型的問題使得它聽起來像您正在使用可變長度數組。這些塊不能在塊內引用,因爲它們無法可靠地複製到塊的上下文中(基本上是自定義的類型),並且在處理上下文時可能會混淆offsetof-樣式的計算。您可以通過使用固定大小的變量(只需使用您需要的最大大小),將數組移動到全局/靜態存儲器,或分配指針並執行指針算術來自己訪問第二個維度來解決此問題。

+0

如何添加__block符。在Xcode文檔中有一個與dispatch_apply有關的例子,但這不起作用。 (我甚至發現有人抱怨的票)\t \t 我不改變數組的大小,這就是爲什麼我不明白錯誤消息。 \t \t 無論如何,我用阪本的解決方法,我現在工作得很好。但感謝您的幫助! – Jofro