2011-07-06 6 views
6

Mam napisany kod do obliczania dynamiki dużego zestawu sprzężonego wzoru podstawowego za pomocą metody Runge-Kutta. Kod zawiera wiele pętli for, w których każdy krok jest niezależny. Zamierzam użyć Grand Central Dispatch do przyspieszenia programu. Oparłem moją próbę na przykładzie, który znalazłem pod adresem http://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-central. Ani mój kod, ani przykład na Macresearch nie są kompilowane na moim komputerze (MacOSX 10.6.8 Xcode 4.0.2). Więc tutaj jest mój kod:Jak napisać do tablicy z pętli 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  
            } 
         ); 
... 

Łamie z błędem:

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

Próbowałem wymiany tablic (wartości K1) z wektorami, ale potem się kolejny komunikat o błędzie zamiast:

Semantic Issue: Read-only variable is not assignable

To tutaj utknąłem, nie bardzo wiedząc, co te komunikaty o błędach próbują mi powiedzieć. Spędzam trochę czasu na wyszukiwaniu i pytaniu, czy ktoś może pomóc. Byłbym bardzo wdzięczny za wskazówki lub lepsze sposoby rozwiązania tego problemu.

Odpowiedz

14

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

W ramach implementacji bloków nie można uzyskać dostępu do tablicy C z bloków. (Nie mogę znaleźć dokumentację na ten temat ...)

Jest łatwo naprawić :-)

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

Wielkie dzięki! To wydaje się naprawić problem! – Jofro

1

Aby zapisać przechwyconą zmienną, należy dodać specyfikację pamięci __block do deklaracji. To powinno naprawić problem, który widzisz.

Problem z zmiennie zmodyfikowanym typem sprawia, że ​​brzmi to tak, jakby używać tablicy o zmiennej długości. Nie można ich przywoływać z bloków, ponieważ nie można ich wiarygodnie skopiować do kontekstu bloku (w zasadzie niestandardowego typu C struct) i mogą one zepsuć obliczenia stylu w stylu offsetof podczas pracy z kontekstem. Możesz rozwiązać ten problem, pracując ze zmienną o stałym rozmiarze (wystarczy użyć maksymalnego rozmiaru, jakiego potrzebujesz), przesuwając tablice do pamięci globalnej/statycznej, lub przydzielając wskaźnik i wykonując arytmetykę wskaźnika, aby uzyskać dostęp do drugiego wymiaru.

+0

Jak mogę dodać specyfikator __block. Jest to przykład w połączeniu z dispatch_apply w dokumentacji Xcode, ale to nie działa. (Znalazłem nawet bilet kogoś narzekającego na to) \t \t Nie zmieniam rozmiaru tablic, dlatego nie zrozumiałem komunikatu o błędzie. \t \t W każdym razie zastosowałem obejście Sakamoto i teraz działam dobrze. Ale dzięki za pomoc! – Jofro