- ベストアンサー
_beginthread関数の引数
VC++ 2005 Win32コンソールアプリケーション で 1つ目のスレッドで「10」 2つ目のスレッドで「20」 3つ目のスレッドで「30」 と出力するために下記のように記述しました。 結果は予定通り出力されているのですが、 _beginthreadの第3引数の渡し方、 printfの引数の表示の仕方はこれでよいのでしょうか? void myThread(void *pParam); int arg[3] = {10, 20, 30}; int main() { HANDLE hThread[3]; int i; for (i = 0; i < 3; i++) { hThread[i] = (HANDLE)_beginthread(myThread, 0, &arg[i]); } /* 以下略 */ } void myThread(void *pParam) { printf("%d\n", *(int *)pParam); _endthread(); }
- C・C++・C#
- 回答数3
- ありがとう数5
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
hThread[i] = (HANDLE)_beginthread(myThread, 0, arg[i]); と呼んで void myThread(void *pParam) { printf("%d\n", (int)pParam); _endthread(); } でも可。 要は「呼んでる方と呼ばれてる方の辻褄が合ってればOK」って事。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
> hThread[i] = (HANDLE)_beginthread(myThread, 0, arg[i]); > void myThread(void *pParam) > printf("%d\n", (int)pParam); 64ビット環境になったりするとポインタとintの 表現範囲は異なる為、つじつまが合ってません。 動いているのは、「たまたま」動く環境だったと いうだけでしょう。 # [Win32コンソールアプリケーションで]とあるので、 # 32ビット環境で動けば良いのかもしれませんが、 # 危険性がある以上は示唆しておくべきだと思います。 > hThread[i] = (HANDLE)_beginthread(myThread, 0, &arg[i]); > printf("%d\n", *(int *)pParam); ややこしいですが、一般的には質問者さんの コードのほうが正しいと思います。
お礼
回答ありがとうございました。 参考にさせていただきます!
- chie65535
- ベストアンサー率43% (8522/19371)
追記。 > hThread[i] = (HANDLE)_beginthread(myThread, 0, arg[i]); >と呼んで hThread[i] = (HANDLE)_beginthread(myThread, 0, (void *)(arg[i])); じゃないとワーニングが出る。
関連するQ&A
- (マルチスレッド)_beginthreadexに複数の引数を渡す
現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }
- ベストアンサー
- C・C++・C#
- 関数の引数表記なしについて
はじめまして。C言語初心者です。 質問させてください。 関数を宣言して引数を表記しないで使用することは可能なのでしょうか? またどのような場合に使用するのでしょうか? 例として以下コードになります。 ----------------------- #include<stdio.h> int test1(int a); void test2(int b); void main(){ int i = 0; int j = 0; //この部分 i = test1; printf("%d\n", i); //この部分 j = test2; printf("%p\n", j); } int test1(int a){ return a + 1; } void test2(int b){ printf("test"); } --------------------------- 出力結果を見ると関数のアドレスが帰ってくるように思われますが、詳細が分かりません。 詳しい方がいらしましたら教えてください。 宜しくお願いいたします。
- 締切済み
- C・C++・C#
- 可変長引数関数のマクロ関数について
可変長引数をとる関数をマクロで置き換えたいのですが、 この方法だとできません。うまく実現できないでしょうか? ------------------------------------------------------- #define TRACE(arg, ...) trace(__FILE__,__LINE__,arg, ...) void trace(char *file, int line, char *arg, ...) { ...(略)... } func() { ... TRACE("hello %s", "taro"); ... } ------------------------------------------------------- よくあるトレース処理だと思いますがこんな感じです。 他にも代替手段は考えつきますが、 可変長引数の関数のマクロが可能かが知りたいです。 どなたがご存知の方がいらっしゃいましたら、よろしくお願いします。
- 締切済み
- C・C++・C#
- 任意の数の引数をとる関数
gccでprintfのように、任意の数の引数をとる関数を作りたいのですが、MS-VCでは hoge(arg1, arg2, ...) という書式のようですが、gccではエラーでした。 どうすればいいのでしょうか?
- 締切済み
- C・C++・C#
- va_listを使用したfscanf()関数のラッパー関数
【環境】WinXP/VC++6.0/Win32コンソールアプリ 初めて質問させていただきます。 テキストファイル入出力クラスを作成中で、書式指定付きの読込み関数を次のように定義しています。 CTextFileIO::Read(LPCSTR lpFormat,...) { va_list arg; va_start(arg,lpFormat); fscanf(this->hFile,lpFormat,arg); va_end(arg); } hoge.txtの内容 5 使用する場合 void main() { int i; CTextFileIO file("hoge.txt"); // ☆読込み file.Read("%d",&i); // i に 5 が読込まれることを期待している。 printf("%d",i); } 実行結果 -858993460 ご質問は、☆の箇所でどうして i に 5 が取得できないのかということです。同様の作り方で出力関数 vfprintf() のラッパー関数を試した場合は正しく動作しました。 以上よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 構造体を引数とする関数について
関数に構造体を渡したいのですが、エラーが出て上手くいきません。 下のプログラムのように組んでいるのですが、どこが問題なのかご教授願いたいです。 もし、下記のプログラムのようなことができないのでしたら、代替案を提示してもらえると助かります。 環境はVC++です。よろしくお願いします。 struct DATA{ int x; char name[32]; }; void info(DATA *status[]); int main(void){ DATA student[3] = { { 1, "佐藤" }, { 2, "高橋" }, { 3, "田中" }, }; info(&student[]); return 0; } void info(DATA *status[]){ for (int i = 0; i < 3; i++){ printf("%d\n%s", status[i]->x, status[i]->name); } }
- ベストアンサー
- C・C++・C#
- 関数の引数をvoid*でキャストする
最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。
- ベストアンサー
- C・C++・C#
- main関数の事についてお聞きします。
Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。
- ベストアンサー
- C・C++・C#
- 引数に二重配列のある関数について
void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございました。 参考にさせていただきます!