2013-07-04 264 views
0

我正在通過傳遞他們的結構和運行到一些問題通過創建pthreads我的方式。用下面的代碼,我可以把一個整數集到結構,然後在線程中使用它們:通過結構傳遞動態數組pthreads通過結構

struct v{ 
    int i; 
    int j; 
}; 
void* update(void* param); 

int main(int argc, char* argv[]){ 
    ... 
    int j = 2; 
    int i = 1; 
    pthread_t tid; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    struct v *argument = (struct v*)malloc(sizeof(struct v)); 
    argument->i = i; 
    argument->j = j; 
    pthread_create(&tid, &attr, update, argument); 
    ... 
    pthread_join(tid, NULL); 
    return 0; 
} 
void* update(void* arg){ 
    ... 
    struct v * argument = (struct v*) arg; 
    int j = argument->j; 
    int i = argument->i; 
    cout << j << ' ' << i << endl; 
} 

不幸的是,我似乎不能夠動態數組添加到結構。我知道動態數組不能在main()之前聲明的結構中工作,但即使使用指針,我似乎也無法獲得編譯代碼。在main()中,我添加了這些行:

int arr[i][j]; 

下面

argument->j = j; 

我說:

argument.current = arr; 

我改變了結構到:在

struct v{ 
    int i; 
    int j; 
    int *ray; 
}; 

隨着更新功能,我有:

int * curr = argument->ray; 

當我編譯時,我得到一個錯誤信息「請求成員'ray'在'參數',它是非類類型'v *'」。

我是否會通過這種方式添加這個動態數組而導致錯誤的路徑?

我很感激任何人都可以提供的幫助。

+0

在'argument.current = arr;',什麼是'current'?一個錯字? – johnchen902

+0

C++中不允許使用可變長度數組。 –

+0

除非有非常好的理由否則,只需使用'std :: vector ray;'。 –

回答

1

我明白動態數組不會在結構工作之前,在main()

在至極的方式應他們「不工作」,宣佈?只要您定義並正確使用它們,就無需聲明/定義它們。

int arr[i][j]; - 這是一個VLA,因爲ij不是編譯時常量。 VLA不是C++ 03和C++ 11的一部分,它們是C特性。 C++ 14將引入類似的東西。

argument.current = arr;

我改變了結構到:

struct v{ 
    int i; 
    int j; 
    int *ray; 
}; 

哪裏是在結構current?難怪它不能編譯;-)(你可能要下次提供SSCCE)。

夠挑剔,讓我們嘗試解決您的問題:

二維數組不能用簡單的指針來實現。您可以使用指向指針的指針,例如像這樣:

struct v{ 
    int i; 
    int j; 
    int **ray; 
}; 

但是既然你使用C++,我建議使用向量或類似的向量。您可以在This SO answer中找到更多有關二維數組分配的信息。因爲你使用的是C++,所以你很可能會使用C++ 11或boost,因此你有很好的機會可以使用std::threadboost::thread,在你的線程周圍有一個很好用的可移植包裝器環境,在你的情況下,pThread。你的代碼可能看起來像這樣:

void update(std::vector<std::vector<int>>& param) { //or whatever signature suits your needs 
    //... 
} 

int main() { 
    int i = 42; 
    int j = 11; 
    std::vector<std::vector<int>> myVecVec(j, std::vector<int>(j)); 

    std::thread theThread([&](){update(myVecVec);}); 
    //or: 
    //std::thread theThread(update, std::ref(myVecVec)); 

    //... 

    theThread.join(); 
} 

沒有線程內部擺弄,不需要手動內存管理。