2011-07-06 13 views
6

Runge-Kutta-yöntemini kullanarak büyük bir birleştirilmiş ana denklemin dinamiklerini hesaplamak için bir kod yazdım. Kod, her adımın bağımsız olduğu bir sürü döngü içerir. Programı hızlandırmak için Grand Central Dispatch'u kullanmayı düşünüyorum. Denememi http://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-central numaralı telefondan bulduğum bir örnek üzerine kurdum. Ne kodum ne de macresearch'teki örnek makinemde derlenmiştir (MacOSX 10.6.8 Xcode 4.0.2). Yani burada benim kodudur:Bir dispatch_apply (GCD) döngüsünden bir diziye nasıl yazılır?

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

Bu hata ile kırar:

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

Ben vektörler ile diziler (değerler, k1) yerine çalıştı, ama sonra yerine başka bir hata mesajı alıyorum:

Semantic Issue: Read-only variable is not assignable

Bu noktada, bu hata iletilerinin bana ne anlatmaya çalıştığını bilmediğim bir şey değil. Birilerinin yardım edip edemeyeceğini araştırmak ve sormak için epey zaman harcıyorum. Bunu çözmek için ipuçları veya daha iyi yollar için çok minnettar olurdum.

cevap

14

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

Bloklar uygulaması altında, bir C dizisine bloklardan erişilmesine izin verilmez. Ben __block belirtici nasıl eklerim

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

Çok teşekkürler! Bu sorunu düzeltmek için görünüyor! – Jofro

1

Yakalanan bir değişkene kaydetmek için, bildirimine __block depolama belirtecini eklemeniz gerekir. Bu görüyor std::vector sorunu düzeltmelidir.

Değişken olarak değiştirilmiş bir türe sahip olan sorun, değişken uzunluklu bir dizi kullandığınızı gösterir. Bunlar, bloklar içinden gönderilemez, çünkü bunlar, bloğun içeriğine (temel olarak özel bir C struct tipi) güvenilir bir şekilde kopyalanamazlar ve içerikle çalışırken, offsetof biçimindeki hesaplamaları dağıtabilirler. Bu problemi, sabit boyutlu bir değişkenle (sadece ihtiyacınız olan maksimum boyutu kullanarak), dizileri global/statik depoya taşıyarak veya bir imleci ayırarak ve ikinci boyuta kendiniz erişmek için işaretçi aritmetiğini yaparak çözebilirsiniz.

+0

:-) kolay bir düzeltme vardır

(Ben ... de belgelere bulamıyorum). Xcode belgelerinde dispatch_apply ile bağlantılı bir örneği var, ancak bu çalışmıyor. (Bu konuda şikayet eden birinin bir biletini bile buldum) \t \t Dizilerin boyutunu değiştirmiyorum, bu yüzden hata mesajını anlamadım. \t \t Her neyse Sakamoto'nun geçici çözümünü kullandım ve şimdi gayet iyi çalışıyor. Ama yardımın için teşekkürler! – Jofro

İlgili konular