2017-01-11 1 views
0

は、だから私はここに私のプログラムを持っている:POSIX pthread_createは、構造体内の変数の値をスクランブルしますが、それを回避する方法は?

#include <iostream> 
#include <string> 
#include <pthread.h> 
#include <unistd.h> 
#include <math.h> 
#include <stdlib.h> 

using namespace std; 

int const size = 3; 


struct Arguments{ 
    int array[]; 
    float result1[]; 
    float result2[]; 
}; 


//void calc(int arr[], float rarr1[], float rarr2[], int size); 
void* calc(void *param); 

int main(int argc, char *argv[]){ 



    time_t t; 
    srand((unsigned) time(&t)); 

    int arr[size][size] = {}; 
    float rarr1[size][size-1] = {}; 
    float rarr2[size][size-1] = {}; 

    for(int x = 0; x < size; x++){ 
     for(int y = 0; y < size; y++){ 
      int number = rand()%10; 
      arr[x][y] = number; 
     } 
    } 

    for(int x = 0; x < size; x++){ 
     for(int y = 0; y < size; y++){ 
      cout << arr[x][y] << " "; 
     } 
     cout << endl; 
    } 

    cout << endl; 

///////////////////////////////////////// 

    pthread_t child; 

    struct Arguments input; 

    for(int i = 0; i < size; i++){ 

     input.array[i] = arr[0][i]; 
    } 

    pthread_create(&child, NULL, calc, (void*)&input); 
    pthread_join(child, NULL); 

    //calc(&input); 

    for(int i = 0; i < size-1; i++){ 
     rarr1[0][i] = input.result1[i]; 
     cout << "Test: " << rarr1[0][i] << endl; 
    } 

////////////////////////////////// 


    return 0; 
} 

//void calc(int arr[], float rarr1[], float rarr2[], int size){ 

void* calc(void *param){ 

    struct Arguments *input = (struct Arguments*)param; 

    int arr1[] = {}; 

    float rarr1[] = {}; 
    float rarr2[] = {}; 

    for(int i = 0; i < size; i++){ 

     arr1[i] = input->array[i]; 
    } 

    for(int i = 0; i < size; i++){ 
      int a = arr1[i]; 
      int b = arr1[i+1]; 

      int difference = a-b; 

      if(difference < 0){ 
       difference = difference * -1; 
      } 

      float euc = 1 + pow(difference, 2); 
      euc = sqrt(euc); 

      rarr1[i] = euc; 
    } 

    for(int i = 0; i <size-1; i++){ 
     input->result1[i] = rarr1[i]; 
    } 

    for(int i = 0; i <size-1; i++){ 

     int a = arr1[i]; 
     int b = arr1[i+1]; 

     int difference = a-b; 

     if(difference < 0){ 
      difference = difference * -1; 
     } 

     float apar = (difference/rarr1[i]); 

     float result = asin(apar); 
     result = result*(180/3.14); 

     rarr2[i] = result; 
    } 

    return NULL; 

} 

トラブルの原因となる重要な部分は//////線の間にあるが、それは役に立つかもしれないので、私は、コンテキストのためのコードの残りの部分を残しました。

私はプログラムで重要な計算を行うcalc(param);関数を持っています。

正しい結果が得られた直後に、私は自分自身(実際にコード内に関数呼び出しを含めることによって)とテストループを呼び出す限り、うまくいきます。

しかし、私はpthread_create();を使用してその機能の実行を担当する新しいスレッドを作成しようとすると、テストループはナンセンスを吐き出し、ランダムな巨大な数が毎回違うようになります。

コードはどちらかといえばコンパイルされているので、ちょっと変わっています。文字通り、私が変更するのはこれらの2行だけです。

私は間違って何をしていますか、Pthreadで起動したときに関数がゴミを吐き出すのはなぜですか?それを修正する方法はありますか?

はどんな配列のサイズを宣言していない:誰もが同様の問題を持っていますので、もし

+0

ここで、 'input'に配列の割り当てサイズを指定しますか? –

+0

ああ、私は今それを見る。だから、実際にpthreadを使うときに配列のサイズを宣言しなければならないのですか?私は 'int array [];を' int array [size];に変更しました。正しい結果が得られているようです。 これは正しいのですか?配列サイズを大きくすると、プログラムがセグメント化エラーをスローすることに気付きました。 ご回答いただきありがとうございます。 –

+0

"pthreadを使用する場合、配列のサイズを実際に宣言する必要がありますか?"あなたは常にそれを指定しなければなりません。 'int array [];'のようなものは、関数のパラメータとしてのみ有効です。 –

答えて

0

[OK]をクリックします。私の結果配列をの代わりにfloat result1[];の代わりに私のプログラムが正しく動作しなかったことが判明しました。

関連する問題