2016-10-13 11 views
0

パラメータ(void * args)を持たなければならないスレッド関数に2D配列を渡したいとします。関数内で配列を繰り返し処理するときは、次のエラーが発生します。2D配列をスレッド関数に渡す

添え字付きの値は配列、ポインタ、またはベクトルではありません sumArrays + = args [i] [j];

私はこれを回避する方法がわかりません。スレッド関数に渡される値も整数です。

何か助けが素晴らしいだろう!

おかげ

+3

問題を再現する最小限の例を示します。 – 2501

+1

関数にパラメータとして渡されると、配列は最初の要素へのポインタに減衰します。したがって、スレッドの 'args'パラメータとして配列を渡す場合、スレッド関数はそれを要素型へのポインタ変数に割り当てる必要があります。配列を直接渡すのではなく、 'struct'型のメンバを使ってそれを指し、スレッドの' args'として 'struct'へのポインタを渡すことができます。スレッド関数はそれを適切な 'struct'ポインタ型にキャストできます。 –

+0

'pthreads 'を使っているなら、これは素晴らしいチュートリアルです。あなたがいなくても、概念は同じです:https://computing.llnl.gov/tutorials/pthreads/ – yano

答えて

-1

代わりstructを使用しての、1も正しいタイプでローカル変数を作成することができます。

#define ROWS 3 
#define COLS 3 

/* Sum the values in a 3x3 array. */ 
/* This would be your thread entry point. */ 
void sum(void *args) { 
    int (*array)[ROWS][COLS] = args; // Declare and initialize a pointer to a ROWSxCOLS array of ints. 

    int row; 
    int col; 
    int total = 0; 
    for(row = 0; row < ROWS; row++) { 
     for (col = 0; col < COLS; col++) { 
      total += (*array)[row][col]; // Access [row][col] from the array pointed to by "array". 
     } 
    } 

    (void) total; 
} 

int main(int argc, char** argv) { 
    int arrayIn[ROWS][COLS] = { 
     {0, 1, 2}, 
     {3, 4, 5}, 
     {6, 7, 8} 
    }; 

    sum(arrayIn); 
} 

@イアン・アボットによって提案structソリューションは簡単にできるという利点を持っていますより複雑なデータをスレッドに渡す(配列の次元など)。