2017-03-25 1 views
0

説明ベクトル<int>をvoid *に変換してベクトル<int>に戻すにはどうすればよいですか?

私はpthreadの経由で呼び出される関数のパラメータとして渡すことができるように、ボイド*にベクトルを変換する必要があります。その関数では、要素にアクセスするためにvoid *をベクトルに変換する必要があります。

コード

void* compare(void* x) { 
    vector<int>* v = (vector<int>*)x; 
    vector<int> v1 = v[0]; 
    vector<int> v2 = v[1]; 
    ... 
} 

int main() { 
    ... 
    vector<int> x = {1, 2, 3, 4}; 
    pthread_create(&threads[i], NULL, compare, static_cast<void*>(&x)); 
    ... 
} 

問題

vは2つの別々のベクトルが含まれている理由を私は理解していません。さらに、有効な値はv1とv2の間で回転します。時には1つは迷惑メールであり、もう1つは有効な値です。これはキャスト/コンバージョンやスレッドの同期に関する大きな問題に問題がありますか?

+0

'int型V1 =(* v)を試してみてください[0] v'がベクトルでないベクトルへのポインタである' 'ので。 –

+0

std :: copyを使用するか、またはC++ 11の場合static_castを使用 –

+1

C言語にはも他のテンプレートもありません。 'c'タグを削除してください – user3629249

答えて

0
void* compare(void* x) { 
    vector<int>* v1 = (vector<int>*)(x); 
    vector<int> v = v1[0]; // it will always be v[0] 
    cout << v[0] << " " << v[1] << " " << v[2]; 
} 

int main() { 
    pthread_t thread; 
    vector<int> x = {1, 2, 3, 4}; 
    pthread_create(&thread, NULL, compare, static_cast<void*>(&x)); 
    pthread_join(thread, NULL); 
} 

又は

void* compare(void* x) { 
    vector<int> v = ((vector<int>*)x)[0]; 
    cout << v[0] << " " << v[1] << " " << v[2]; 
} 

出力:

1 2 3 

この例でv1自体をベクトルないベクターへのポインタです。ポインタのベースアドレスです。 v1[0]を取ると、実際のベクトルが取れます。 (&x)にベクトルのアドレス(ベクトルではありません)を渡しました。そのため、ベクトルポインタとベクターに型キャストする必要があります。

1

間違った質問です。引数の型に対処する方法を知っている<グラム>使用std::thread、:

void f(std::vector<int>& arg); 

int main() { 
    std::vector<int> argument; 
    std::thread thr(f, std::ref(argument)); 
    thr.join(); 
    return 0; 
} 
関連する問題