• ベストアンサー

エラーの原因は?「この関数の定義が見つかりません」

<プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> ヘッダー void Transmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString); cppファイル void CMyDlg::Transmit(HANDLE hCom,OVERLAPPED old,unsigned char ucBuf[],DWORD dwByte,CString s) { } とコーディングしていて、ビルドも実行も全く問題ないのですが、 ClassViewでTransmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString) をダブルクリックして、関数に移ろうとすると 『この関数の定義(インプリメンテーション)が見つかりません』 というエラーが出ます。 <質問> このエラーは何が原因で出ているのでしょうか?? 宜しければご指摘の程お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#75489
noname#75489
回答No.2

ヘッダでの宣言を void Transmit(HANDLE hCom,OVERLAPPED old,unsigned char ucBuf[],DWORD dwByte,CString s); にすればよいと思います。 ちなみにClassViewから関数を追加すれば質問されたような状態にはならないと思います。

meeyooyoo
質問者

お礼

itohoo様、有難うございます。 ご指摘いただいた通りにコーディングすると、直りました! これで、ストレスなくプログラミングできます。 本当に有難うございました。

その他の回答 (1)

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

経験上、関数の情報を保持しているデータベースなどが壊れたとか。 クラスメンバの自動表示が出来なくなったり、割と良くある事かと。 取りあえず、プロジェクトをバックアップした上で、 プロジェクト名.ncb プロジェクト名.pdb の2ファイルを削除し、リビルドなどで関数情報を再構築するとか。 プロジェクトのFileビューから、対象ファイルを一旦除外、再度追加とか。

meeyooyoo
質問者

補足

neKo_deux様、有難うございます。 プロジェクト名.ncb プロジェクト名.pdb を削除して、リビルドしたのですが、症状は直りませんでした。 プロジェクトのFileビューから、対象ファイルを一旦削除し、 リビルドしました。リンクエラーが出ました。 そしてプロジェクトにcppファイル新規作成、 元のソースのコピーを貼り付けて、リビルドしてみたのですが、 症状は直りませんでした。 他に試せる方法があれば教えて下さい! 宜しくお願いします。

関連するQ&A

  • WriteFileのエラー995は何が原因?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> 以下のコード部分は、これまでエラーは無かったのですが、 他の部分をいろいろといじった結果以下のコードでエラーが出るように なりました。 HANDLE hCom;//COMポートのハンドル OVERLAPPED old;//構造体 unsigned char ucBuf[];//送信する内容 DWORD dwByte;//送信するバイト数 //上記変数は宣言後、正しい値を入れています。 BOOL blRet;//実行結果 if(WriteFile(hCom,ucBuf,dwByte,NULL,&old) == 0){ blRet = GetLastError(); } を実行後、blRetの結果を確認すると995で、 「スレッドが終了したか、またはアプリケーション要求によって、I/O 処理が中止されました。」 が出ました。 <質問> このエラーは何が原因でしょうか? 宜しければご指摘の程よろしくお願いします。

  • CreateThreadのエラー

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> 何も実行しないスレッドを作成するようにコーディングしたのですが、 「error C2440: 'type cast' : '' から 'unsigned long (__stdcall *)(void *)' に変換することはできません。」 というエラーが出ました。 これは、何が原因で、解決方法はありますか? <ソース> void CMyDlg::OnButton1() { HANDLE handle; DWORD id; handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&id); } void CMyDlg::ThreadFunc(void) { } <ヘッダ> void ThreadFunc(void); 宜しければご指摘お願い致します。

  • バイナリ送信で出るエラーコードの意味が分かりません

    シリアルポートでバイナリを非同期で送信するプログラムを作成しています。 以下のソースで実行すると、「重複したI/O処理を実行しています」というエラーがでました。 何が間違っているのか分りません・・。 どうかご指摘お願いします。 void CMyDlg::OnReset() { //COMポートオープン HANDLE hCom; hCom = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); //通信設定 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom,&dcb); OVERLAPPED old; // オーバーラップ構造体の初期化 ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; //データ送信 char wbuf[7] = {0x02,0x00,0x01,0x00,0x31,0x15,0x12}; DWORD wbyte; WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,&old); //エラーコード取得&文字列に変換&表示 LPVOID lpMessageBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),//エラーコード取得 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox((LPCTSTR)lpMessageBuffer); //メッセージボックス LocalFree( lpMessageBuffer ); //COMポートクローズ CloseHandle(hCom); }

  • ReadFileでエラーが出ます。

    シリアルポートで非同期でバイナリを受信するプログラムを作成しています。 受信部分は以下のソースです。これで実行すると「データ受信エラー」のダイアログが出ます。 GetLastErrorでは998(メモリ ロケーションへのアクセスが無効です。)が得られました。 ネットで調べましたが何が原因かも分かりません・・。 どうかアドバイスお願いします。 HANDLE hEvent; hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; DWORD dwCount; char* rdBuf; DWORD dwRead; if(!ReadFile(hCom,rdBuf,dwCount,&dwRead,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&dwRead,TRUE); } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); }

  • 可変長バイナリを読み込みたい

    <プログラム環境> Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース <目的> COMポートから可変長のバイナリデータを受信する <質問> 受信するバイナリの長さは受信した内容で分かるようになっています。 例えば、 先頭が"0x0b"であれば11個のバイナリが続いて送られてくるという感じです。 この例ように、送られてくる内容("0x0b")を確認して、それに応じて 11個データを読み込む、というプログラムにするには、どのようにしたら良いでしょうか? 今は以下のソースで、バイナリの長さを指定して受信しています。 //////////オーバーラップ構造体の初期化////////// OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; //////////データ受信//////////////////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE) == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)){ //"データ受信完了" }}} else //エラー } 宜しければ、ご指摘の程よろしくお願いします。

  • C言語でのコンパイルエラー

    初心者です。 非常に基本的な質問かもしれませんが、 ご回答いただけたらうれしいです。 void test1(unsigned char* data) { } void test2(unsigned char** data) { } int main(void) { unsigned char data1[6]; unsigned char data2[6][6]; test1(data1); test2(data2); } としてtest1はうまくいくのに、 test2はコンパイルエラーになります。 どっちもポインタになると思うのですが…。 また、unsigned char data2[6][6]を 他の関数の引数とする場合は どうすればよろしいのでしょうか? 宜しくお願いいたします。

  • CreateFileしてもうまくいきません・・。

    シリアルポートで通信するためのプログラミングを始めたばかりなのですが、COMポートのオープンが成功しません。 以下を実行しているのですが、何が間違いでしょうか? ちなみに、PCMCIAに挿入したPCカードから通信したいと考えています。単純に"COM1"というのであっているのかも分かりません・・。 よろしくお願いします。 void CMyDlg::OnReset() { HANDLE hCom; hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED NULL ); if(hCom == INVALID_HANDLE_VALUE){ MessageBox("ポートオープン失敗"); } else{ MessageBox("ポートオープン成功"); } }

  • バイナリを16進数で表示したい

    VC++6.0,MFC,ダイアログベースでバイナリデータ受信とファイル書き込みのプログラムを作っています。 COMポートからバイナリを10バイト受信し、受信した内容を1.txtに書き込み、1.txtを開いて、受信した内容を確認したいです。 以下のソースで実行すると、1.txtにはFフフフフフフフフフと書かれていました。これを16進数で表示させたり、10進数で表示させるにはどうしたらいいでしょうか? /////////データ受信////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE) == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)){ //"データ受信完了" }}} else //エラー } /////////ファイルに書き込む////////////// HANDLE hFile; hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL ); if(WriteFile( hFile, rdBuf,10, &wbyte, &old ) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE)==WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){ //書き込み完了 }}} else //書き込み失敗 }

  • メンバー関数の追加に制限あり?

    vc++ MFC SDI で開発している初心者です。 ClassViewウィンドウで「Cプロジェクト名View」 を右クリックし、メンバー関数の追加で、 関数の型をvoid、アクセス制御をprivate として関数を幾つか作成していったのですが、 51番目以降に作成した関数をClassViewウィンドウで ダブルクリックすると 「この定義(インプリメンテーション)が見つかりません。」 というメッセージが表示されます。 メンバー関数の追加には数の制限があるのでしょうか? どこかのパラメータを変えることでメッセージが表示されなくなるのでしょうか? ご存知の方がいらっしゃいましたら 教えていただきたいのでよろしくお願いします。

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

専門家に質問してみよう