• 締切済み

自作関数の引数

encyの回答

  • ency
  • ベストアンサー率39% (93/238)
回答No.5

すでに回答にあるとおり、可能です。 # GetAsnwer() にある 「p = 123;」の部分は「*p = 123;」の間違いである # とう前提で話を進めます。 # 間違いでなければ、jacta さんのおっしゃるように、何をやりたいのか # よく分からなくなってしまいますし。。。 int GetAnswer( LPVOID param ) { …… *(DWORD *)param = 123; return 0; } といった感じですね。 ただし「可能」というだけで、あまりお勧めしません。 引数の void ポインタ経由でわたってきたデータが何であるかが不明になるだけでなく、この変数を参照するたびにキャストしなければならず、非常に面倒くさいです。 # 面倒くさい=ミスしやすい、ということですからねぇ。。。 それにキャストはコード全体を見にくくします。 というわけで、ertvak さんが最初に示されている void ポインタ経由でわたってきたデータは、使いたい方の変数に代入しなおして使うことをお勧めします。 int GetAnswer( LPVOID param ) { DWORD *p; p = (DWORD *)param; …… *p = 123; return 0; }

ertvak
質問者

お礼

「p = 123;」の部分は「*p = 123;」の間違いでした。 No2、No4、の方にもよく理解してもらいました。 実際にはコールバックなのでLPVOIDは変更不可能な状況です。 それに引き換え1,3は,,, static_castで解決しました。

関連するQ&A

  • 関数のコピー

    以下のようなソースがあります。 していることは、char配列に関数をコピーしています。それを関数ポインタに変換して、実行しています。 自作の場合はできるのですが、 MessageBoxをコピーすると以下(字数の関係上無理でした。)のようにメモリ内容がなっており、そのままコピーしたつもりですが、若干異なっております。 どのようにすればMessageBoxがじっこうできるのか, 教えていただきたく質問しました。 よろしくお願いします。 mb,code3が該当分です。 //ソース #include<stdio.h> #include<memory.h> #include<windows.h> int func(int cnt) { return cnt*10; } int func2(int cnt,int cnt2) { return cnt+cnt2; } char *func3() { return "Hello"; } int main() { int (*fa)(int); //MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaotion,UINT uType); int (*fm)(int,int); int (*mb)(HWND,LPCTSTR,LPCTSTR,UINT); char *(*hl)(void); /*fa=func; printf("%d",fa(5)); getchar(); */ char code[12800]; char code2[12800]; char code3[80000]; char code4[12800]; memset(code,0,12800); memset(code2,0,12800); memset(code3,0,80000); memset(code4,0,12800); memcpy(code,(char *)func,12800); memcpy(code2,(char *)func2,12800); memcpy(code3,(char *)MessageBox,80000); memcpy(code4,(char *)func3,12800); fa=(int(*)(int))(void *)code; fm=(int(*)(int,int))(void *)code2; mb=(int(*)(HWND,LPCTSTR,LPCTSTR,UINT))(void *)code3; hl=(char *(*)(void))(void *)code4; printf("%d\n",fa(3)); printf("%d\n",fm(3000,10)); printf(hl()); MessageBox(NULL,"","",MB_OK); mb(NULL,"","",MB_OK); getchar(); return 0; }

  • int型変数をchar型変数に格納する方法

    int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

  • 関数の引数を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++ではありません。

  • コンソールからのメッセージボックスをアクティブに

    Win32APIについて教えてください。 #include <iostream> #include <windows.h> int main() {   int i=0;   char mes[20]; // std::cin >> i;   std::sprintf(mes, "%dが入力されました", i);   MessageBox(NULL, mes, "test", MB_OK);   return 0; } をコンソールから実行するとメッセージボックスがアクティブになるのですが、コメントの部分を外してコンソールからの入力を受け取ると、コンソールがアクティブになってメッセージボックスがコンソールの下に隠れてしまいます。メッセージボックスをアクティブにすることはできるのでしょうか。 宜しくお願いします(WinXP、bcc32を使用しています)。

  • 配列のポインタに渡す引数

    2次元配列に値をつめて、char*[]に渡すための 引数XXXは、どう設定すれば、よいのでしょうか? a(work);で、問題ないのでしょうか? いまいちchar*とchar*[]の違いがよくわかりません。 void main { char work[3][5]; sprintf(work[0], %s, "abc"); sprintf(work[1], %s, "def"); sprintf(work[2], %s, "ghi"); a( XXX );←ここの引数 } int a( char* [] ){ }

  • qsortの引数について

    以下のプログラムがあります。 int compare( const char **name1, const char **name2 ) { return strcmp( *name1, *name2 ); } int main( void ) { char *names[] = { "rand", "calloc", "malloc" }; int num = sizeof names / sizeof names[0]; qsort( names, num, sizeof( names[0] ), (int (*)(const void *, const void * ))compare ); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~この部分 return 0; } 上の「~~~」の上の部分のqsort関数の第4引数のキャストの意味が 分かりません。なぜ関数の前に引数が書かれるのでしょうか? またintの後にある(*)は「int型のポインタ」と言う意味なのか、 compare関数のポインタなのかも分かりません。 ご回答よろしくおねがいします。

  • 戻り値の取得が出来ません

    いつもお世話になっています。 ファイルを抽出するプログラムを作成しています。 関数の中で検索処理を行い、ファイルパスを返そうとしたのですが、returnの直前までは値が入っているのに、関数の呼び出し先で値が取れなくなってしまいました。 当方JAVA経験はあるものの、ポインタなどもまだ把握し切れていないC初心者なので、 不勉強で申し訳ないですが、ちょっと急ぎの用事のため、質問させて下さい。 **呼び出し元** char* SearchPastFile(CString strFolder,int imageFlag,char transTime[15]); void main( void ){ char* prevFile; // 転送元ファイル名 prevFile = SearchPastFile(cTransPath,iImageFlag,transTime); // 過去ファイルの取得【現状NULL】 MessageBox(NULL,prevFile,"パス",MB_OK);【←(確認用)空の状態】 } **関数** char* SearchPastFile(CString strFolder, int imageFlag, char transTime[15]){ CFileFind FileFind; // すべてのファイルを検索します CString strSearchFile = strFolder + _T("\\*.*"); if(!FileFind.FindFile(strSearchFile)) { Log("ファイルが見つかりませんでした。"); return NULL; } char *p; // ファイルパス BOOL bContinue = TRUE; while(bContinue){ (検索処理中略) // 24時間前のファイル if(imageFlag==1 && spanDays==-1){ Log("ファイルが見つかりました。"); MessageBox(NULL,p,"パス",MB_OK);【←(確認用)ここではパスが取れている】 return p; // 48時間前のファイル } else if(imageFlag==2 && spanDays==-2){ Log("ファイルが見つかりました。"); return p; } } }; return NULL; } prevFileに値を入れたいです。 他の回答を見て、p = (char*)malloc( 16 );などもやってみましたが、取れませんでした。 思い当たる節などがあれば、御教授よろしくお願いします。

  • free()への引数について

    下位にて動的に確保した領域を解放するのは以下のように すればよいのでしょうか?また解放されているか確認する方法はあるのでしょうか? void main(){ char *p = 0x00; if (0 != exaMalloc(&p)) { printf("err\n"); exit(); } free(&p); } int exaMalloc(**p) { *p = malloc(10); if (*p == 0x00) { return -1; } return 0; }

  • sprintf 初歩的な質問

    お世話になっております。 最近独学でC言語の勉強を始めたのですが型の違う値の代入に関して わからないことがあり質問します。 ■やりたいこと■ char型dataの値を2で割った余りを char型ansの[0]から順番に格納してく。 (2の補数を取るためにこのような処理を 考えています(10進を24ビット2進へ変換したい)) ■コード■ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> int main(){ char data[256]="9"; int y; int i; char ans[25]; char* p_ans = ans; y=atoi(data); for(i=0;i<24;i++){ sprintf(ans[i], "%d",y%2); //←エラー y = y/2; } } ■質問■ 上記ソースの中のエラー部分をどのように記述していいのか わかりませんでした。初心者的な発想でポインタを使う方法はと思い sprintf(*(p_ans+i),"%d",y%2); というような記述も試してみましたが駄目でした。 この部分をどのように書いたらいいか詳しい方、教えていただけると 助かります。以上、よろしくお願いします。

  • 関数に引数として配列を渡す方法

    mainからtest関数にクラスAの中の ch[2][4]を渡したいのですが *hiki[1][1] = 'A';がコンパイルに通りません。 やり方が違うのでしょうか? class A{ char ch[2][4]; }; void test(char *hiki){ *hiki[1][1] = 'A'; } int main(){ A ob1; test(&ob1.ch[0][0]); return 0; }