2011-07-06 13 views
6

He escrito un código para calcular la dinámica de un gran conjunto de ecuaciones maestras acopladas utilizando el método de Runge-Kutta. El código contiene muchos bucles for, donde cada paso es independiente. Tengo la intención de utilizar Grand Central Dispatch para acelerar el programa. Basé mi intento en un ejemplo que encontré en http://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-central. Ni mi código ni el ejemplo de macresearch compilan en mi máquina (MacOSX 10.6.8 Xcode 4.0.2). Así que aquí está mi código:Cómo escribir en una matriz desde un ciclo 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  
            } 
         ); 
... 

Rompe con el error:

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

Probé la sustitución de las matrices (valores, k1) con vectores, pero luego me sale otro mensaje de error en lugar:

Semantic Issue: Read-only variable is not assignable

Ahí es donde estoy atascado, sin saber realmente lo que esos mensajes de error están tratando de decirme. Dedico bastante tiempo a buscar y preguntar si alguien podría ayudar. Estaría muy agradecido por consejos o mejores formas de resolver esto.

Respuesta

14

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

En la implementación de bloques, no se permite el acceso a una matriz C desde bloques. (No puedo encontrar la documentación al respecto ...)

Hay una solución fácil :-)

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

¡Muchas gracias! Eso parece solucionar el problema! – Jofro

1

Para almacenar en una variable capturada, debe agregar el especificador de almacenamiento __block a su declaración. Eso debería solucionar el problema std::vector que está viendo.

El problema con un tipo de modificación variable hace que parezca que está utilizando una matriz de longitud variable. No se puede hacer referencia a ellos desde dentro de bloques, ya que no se pueden copiar de manera confiable en el contexto del bloque (básicamente un tipo personalizado C struct), y pueden estropear los cálculos de estilo offsetof al trabajar con el contexto. Puede resolver este problema trabajando con una variable de tamaño fijo (simplemente use el tamaño máximo que necesitará), mueva las matrices al almacenamiento global/estático, o asigne un puntero y realice la aritmética del puntero para acceder a la segunda dimensión usted mismo.

+0

¿Cómo agrego el especificador __block. Hay un ejemplo de esto en relación con dispatch_apply en la documentación de Xcode, pero eso no funciona. (Incluso encontré un ticket de alguien quejándose de eso) \t \t No cambio el tamaño de las matrices, es por eso que no entendí el mensaje de error. \t \t De todos modos usé la solución de Sakamoto y ahora funciona bien. ¡De cualquier modo gracias por su ayuda! – Jofro

Cuestiones relacionadas