2011-02-04 10 views
1

私はwin32スレッドを使ってアプリケーションを並列化する必要があります。コードの一部の1つは、スレッドを使用して静的配列を変更することです。静的配列によるアクセス違反?

私はこのようなパラメータとして配列を渡す:

struct threadParameter { 
    float **array; 
    int row; 
} 

例のコードは次のようになります:

// Main 

float data[100][100] 

for (int i = 0; i < 100; i ++) { 
    tp = (*threadParameter) new threadParameter; 
    tp->array = (float **) data; 
    tp->row = i; 
    AfxBeginThread... // Begin thread code 
} 

// Thread Code 

UINT myThread(LPVOID param) { 

    threadParameter *pp = (threadParameter *) param; 
    for (int j = 0; j < 100; j ++) { 
     pp->array[pp->row][j] = NEWVALUE; 
    } 
} 

プロジェクトを実行するときしかし、私は、「アクセス違反エラーを取得します"私は**配列ポインタを介して配列をacceessしようとすると。配列データが 動的な場合、この問題は発生しません。この問題を解決する方法はありますか(アレイデータを静的から動的に変更することはできません)

+0

サイドノート:MFC –

+0

を使用していない場合は、AfxBeginThreadではなく_beginthreadex()を使用する必要があります.Mehrdadが説明しているように、 'float ** array'を 'float * array'に置き換えてインデックスを手動で計算してください。 –

答えて

7

静的配列はポインタへのポインタではありません。配列全体が単一のの大きなチャンクであり、単一のポインタ、つまり配列のベースへのポインタでアドレス可能です。したがって、配列内の数字を間接参照しているため、

tp->array = (float **) data; 

は正しくありません。配列が暗黙的に適切なポインタ型に変換されるので、キャストする必要があるという事実は赤いフラグを立てる必要があります。

そのため、 "配列は単なるポインタです"という言葉が正しくないのはそのためです。 1次元配列の場合は半分ですが、多次元配列の場合は完全に偽です。 2つのインデックスを使用する必要がある場合は、行に行サイズを掛けて1つのインデックスを行と列のインデックスに変換し、列を追加し、ポインタで配列にインデックスを付けます。

+4

これは、キャストとの割り当ての非互換性を決して解決しないようにする理由です。 –

+1

はい...あなたが典型的な状況のためにそれをしなければならないと感じたら、あなたが足で自分を撃っている可能性があるので、ポインタにキャストするのは特に疲れます。 :) – Mehrdad

関連する問題