• ベストアンサー

VC++でコンパイルエラーが出ますがお教えください。

初心者で申し訳なくおもいます。 下記のソースでコンパイルエラーが出ます。 // CnstDst.cpp : アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" //CnstDst クラス定義 class CnstDst { char sDat[80]; public: CnstDst(char *s); ~CnstDst(); }; CnstDst cd1("テストです"); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: この位置にコードを記述してください。 MessageBox(NULL, "WinMainの入口", "WinMain", MB_OK); CnstDst cd2("テスト1"); MessageBox(NULL, "テスト2", "WinMain", MB_OK); return 0; } CnstDst::CnstDst(char *s) { lstrcpy(sDat, s); MessageBox(NULL, sDat, "コンストラクタ", MB_OK); } CnstDst::~CnstDst() { MessageBox(NULL, sDat, "デストラクタ", MB_OK); } コンパパイルエラーは下記です。 プロジェクト 'CnstDst - Win32 (WCE MIPSII_FP) Debug' 用の中間ファイルおよび出力ファイルを削除しています。 --------------------構成 : CnstDst - Win32 (WCE MIPSII_FP) Debug-------------------- リソースをコンパイル中... コンパイル中... StdAfx.cpp コンパイル中... CnstDst.cpp C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(22) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [14]' to 'const unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(24) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [9]' to 'const unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(31) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [80]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(32) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [80]' to 'const unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(36) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [80]' to 'const unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast clmips.exe の実行エラー CnstDst.exe - エラー 5、警告 0 Microsoft eMbedded Visuai C++ Win32 WCE で行っております。

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

  • ベストアンサー
noname#259269
noname#259269
回答No.1

文字の問題です。文字列はワイドバイトで扱われます。ですので、それに対応した形でコーディングする必要があります。 MessageBox(NULL, L"WinMainの入口", L"WinMain", MB_OK); TCHAR sDat[80]; TCHAR *s などとしてみてください。 #eMbedded Visual C++ は少ししか使ったことないんで、 #事情が違ってたらすみません。

takaboodes
質問者

お礼

アドバイス誠に有難う御座いました。 MessageBox(NULL, L"WinMainの入口", L"WinMain", MB_OK); TCHAR sDat[80]; TCHAR *s 等修正でエラーが取れました。 今後とも宜しくお願い致します。

takaboodes
質問者

補足

ソース下記のように変更しました。 パソコン環境ですがWIN XPで行っております。 // CnstDst.cpp : アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" //CnstDst クラス定義 class CnstDst { TCHAR sDat[80]; public: CnstDst(TCHAR *s); ~CnstDst(); }; CnstDst cd1("テストです"); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: この位置にコードを記述してください。 MessageBox(NULL, L"WinMainの入口", L"WinMain", MB_OK); CnstDst cd2(L"テスト1"); MessageBox(NULL, L"テスト2", L"WinMain", MB_OK); return 0; } CnstDst::CnstDst(TCHAR *s) { lstrcpy(sDat, s); MessageBox(NULL, sDat, L"コンストラクタ", MB_OK); } CnstDst::~CnstDst() { MessageBox(NULL, sDat, L"デストラクタ", MB_OK); } コンパイルエラーは1つになりました。 すみませんが最後のエラーは? 御教授お願いします。 --------------------構成 : CnstDst - Win32 (WCE x86) Debug-------------------- コンパイル中... CnstDst.cpp C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(14) : error C2664: '__thiscall CnstDst::CnstDst(unsigned short *)' : cannot convert parameter 1 from 'char [11]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast cl.exe の実行エラー CnstDst.exe - エラー 1、警告 0

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

既に回答が幾つかでていますが、 これはUnicode版である関数をリンクしようとしている為に、 Const文字列として渡している文字列がワイドキャラクタに 変換できないというエラーです。 const文字列を直接指定する場合はTEXTマクロを使用します。 > MessageBox(NULL, sDat, TEXT("コンストラクタ"), MB_OK); TEXTマクロはTCHAR型などと同様、 マルチバイト環境・ユニコード環境をそれぞれマクロで スイッチできるマクロです。

takaboodes
質問者

お礼

アドバイス誠に有難う御座いました。 2バイト文字の件でした。 今後とも宜しくお願い致します。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.4

>>ANo.2 あ、ちょっと間違えた。 エラーの意味をよく考えてください。 > CnstDst.cpp > C:\Documents and Settings\中野\デスクトップ\テストフォルダ\CnstDst\CnstDst.cpp(14) : error C2664: '__thiscall CnstDst::CnstDst(unsigned short *)' : cannot convert parameter 1 from 'char [11]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast CnstDst.cppの14行目の型が間違っているといっています。 > CnstDst cd1("テストです"); ↓ CnstDst cd1(L"テストです");

takaboodes
質問者

お礼

有難うございました コンパイルはエラーが取れました。 pick52さんのご回答の様に修正いたしました。 今後とも宜しくお願い致します。

回答No.3

 こんにちは。 >>すみませんが最後のエラーは?  ↓此処では?  ×CnstDst cd2("テスト1");  ○CnstDst cd2(L"テスト1");

takaboodes
質問者

お礼

エラーが取れました。 アドバイス誠に有難う御座いました。 今後とも宜しくお願い致します。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

ワイドキャラクタを使用する場合は型はcharではなくwchar_tです。 基本的にはchar型やwchar_t型を直接使用するのではなく設定によって 自動で切り替えられるLPTSTRというマクロを使用した方がいいでしょう。

参考URL:
http://www.usefullcode.net/2006/11/tcharlpctstrlptstr.html
takaboodes
質問者

お礼

アドバイス誠に有難う御座いました。 参考になります。 今後とも宜しくお願い致します。

関連するQ&A

  • コンパイルエラーが理解できません

    初心者ですお教えください。 下記ソースをMicrosoft eMbedded Visual C++ でコンパイルしましたがコンパイルエラーが出て 理解できませんどなたかお教えください。 STANDARDSDK Win32 (WCE x86)Debug STANDARDSDK Emulator -------------------------------------------------- #include "windows.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SYSTEMTIME tm; char s[80]; int iRet; // 現在時刻を取得します。 GetLocalTime(&tm); // 表示する文字列を設定します。 if ((tm.wHour >= 0) && (tm.wHour < 12)) { lstrcpy(s, "おはです。"); } else if (tm.wHour < 17) { lstrcpy(s, "こんちは。"); } else { lstrcpy(s, "こんば。"); } // メッセージボックスに文字列を表示します。 iRet = MessageBox(NULL, s, "MsgBox", MB_OK); // 正常終了を意味する戻り値を返します。 return 0; } <コンパイルエラー内容です> プロジェクト 'MsgMain - Win32 (WCE x86) Debug' 用の中間ファイルおよび出力ファイルを削除しています。 --------------------構成 : MsgMain - Win32 (WCE x86) Debug-------------------- コンパイル中... MsgMain.cpp C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(7) : error C2731: 'WinMain' : function cannot be overloaded C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(3) : see declaration of 'WinMain' C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(17) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [80]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(19) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [80]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(21) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [80]' to 'unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast C:\Documents and Settings\中野\デスクトップ\MsgMain.cpp(25) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [80]' to 'const unsigned short *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast cl.exe の実行エラー MsgMain.exe - エラー 5、警告 0 以上です宜しくお願いします。

  • VC++でコンパイルエラーが出ますがお教えください。

    初心者です。ご教授お願いします。 環境パソコンXP Maicrosoft eMbedded Visual C++ ソースが長すぎる為この欄に入りきれませんので エラー情報にて推測できないでしょうか? エラー内容 Polymo - Win32 (WCE emulator) Debug' 用の中間ファイルおよび出力ファイルを削除しています。 --------------------構成 : Polymo - Win32 (WCE emulator) Debug-------------------- コンパイル中... Polymo.cpp C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(81) : error C2731: 'WinMain' : function cannot be overloaded C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(77) : see declaration of 'WinMain' C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(129) : error C2065: 'WNDCLASSEX' : undeclared identifier C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(129) : error C2146: syntax error : missing ';' before identifier 'wcex' C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(129) : error C2065: 'wcex' : undeclared identifier C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(131) : error C2228: left of '.cbSize' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(133) : error C2228: left of '.style' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(134) : error C2228: left of '.lpfnWndProc' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(135) : error C2228: left of '.cbClsExtra' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(136) : error C2228: left of '.cbWndExtra' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(137) : error C2228: left of '.hInstance' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(138) : error C2228: left of '.hIcon' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(139) : error C2228: left of '.hCursor' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(140) : error C2228: left of '.hbrBackground' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(141) : error C2228: left of '.lpszMenuName' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(142) : error C2228: left of '.lpszClassName' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(143) : error C2228: left of '.hIconSm' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(143) : error C2228: left of '.hInstance' must have class/struct/union type C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(145) : error C2065: 'RegisterClassEx' : undeclared identifier C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(165) : error C2065: 'WS_OVERLAPPEDWINDOW' : undeclared identifier C:\Documents and Settings\中野\デスクトップ\Polymo\Polymo.cpp(251) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsigned short [100]' to 'const char *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast cl.exe の実行エラー Polymo.exe - エラー 20、警告 0 すいませんアドバイスお願い致します。

  • SDKでのエラーなのですが。

    はじめまして。 SDKの勉強で猫でもわかる~のHPの第37章のサンプルを実行したのですが、 --------------------構成: 037 - Win32 Debug-------------------- コンパイル中... main.cpp D:\SDK\037\main.cpp(230) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 D:\SDK\037\main.cpp(248) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー 037.exe - エラー 2、警告 0 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?

  • error C2664

    現在VisualStudio C++ 6.0にてプログラムを組んでいるのですが、以下のようなエラーが出ます。 型の変換ができていないであろうことはわかるのですが、解決方法がわかりません。 どのような解決方法があるのでしょうか? よろしくお願いします。 error C2664: 'strcat' : 1 番目の引数を 'unsigned char [256]' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。

  • VC++2008のC2664エラー

    VisualStdio2008で、現在手を出しているARToolKitを利用したプログラムです。 卒研に使うもので以前別の方が作ったプログラムなのですが、C2664というエラーが発生し、その解決方法がよくわからないので質問します。 以下が、該当する部分のソースです。また、エラーの文章もそのままあげています。 左に書いてあるのは行数です。 「*cparam」が「char **からARParam *へ変換できない」と言うものなのですがどうすれば解決できるでしょうか。 一応、いくつかのサイトも見てみましたがよくわからなかったので質問しました。 解決方法を教えてくださるとありがたいです。 int xsize; int ysize; char *vconf = "Data/WDM_camera_flipV.xml"; //ビデオデバイスの設定ファイル char *cparam = "Data/camera_para.dat"; //カメラパラメータファイル //初期化関数 static void init(void) { ARParam wparam; int i; /*ビデオデバイス設定*/ if(arVideoOpen(vconf) < 0) exit(0); /*ウィンドウサイズ取得*/ if(arVideoInqSize(&xsize,&ysize) < 0) exit(0); printf("Image size(x,y) = (%d,%d)\n",xsize,ysize); /*カメラパラメータ読み込み*/ if (arParamLoad(cparam,1,&wparam) < 0){ printf("Camera parameter load error !!\n"); exit(0); } /*カメラパラメータ初期化*/ 95 arParamChangeSize(&wparam,xsize,ysize,&cparam); 96 arInitCparam(&cparam); 97 printf("*** Camera Parameter ***\n"); 98 arParamDisp(&cparam); /*パターンファイル読み込み*/ for (i = 0; i < OBJ_NUM; i++){ if( (object[i].patt_id = arLoadPatt(object[i].patt)) < 0){ printf("pattern load error : %s\n", object[i].patt); exit(0); } } /*gsubライブラリ初期化*/ 109 argInit(&cparam, 1.0, 0, 2, 1, 0); mqoInit(); } 1>f:\卒検\プログラムセット\カメラキャリブレーション\kakotest\kakotest\kakotest.cpp(95) : error C2664: 'arParamChangeSize' : 4 番目の引数を 'char **' から 'ARParam *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>f:\卒検\プログラムセット\カメラキャリブレーション\kakotest\kakotest\kakotest.cpp(96) : error C2664: 'arInitCparam' : 1 番目の引数を 'char **' から 'ARParam *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>f:\卒検\プログラムセット\カメラキャリブレーション\kakotest\kakotest\kakotest.cpp(98) : error C2664: 'arParamDisp' : 1 番目の引数を 'char **' から 'ARParam *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>f:\卒検\プログラムセット\カメラキャリブレーション\kakotest\kakotest\kakotest.cpp(109) : error C2664: 'argInit' : 1 番目の引数を 'char **' から 'ARParam *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

  • コンパイルエラー

    int m_nTypeCounter=0; と定義した変数を使い if((pDoc->m_sRomaji).GetAt(&m_nTypeCounter)==m_sStr) { m_sAnser += m_sStr; m_nTypeCounter++; } とした際、コンパイルエラーが 『C:\project\2008年課題\コピー ~ 問題・時計領域のみ再描画tokeidouga\ProgramView.cpp(536) : error C2664: 'GetAt' : 1 番目の引数を 'int *' から 'int' に変換できません。 (新しい機能 ; ヘルプを参照)』 この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。』 と表示されます。 どうしたら良いのでしょうか。 よろしくお願いします。

  • 意味がわからないエラーがあります【14歳からはじめるC言語ゲームプログラミング】

    14歳からはじめるC言語ゲームプログラミング(横スクロールアクションゲーム)をやっていて、第5章で意味がわからないエラーがでました・・・ error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [25]' から 'LPCWSTR' に変換できません。 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 というもので、chap4.cppの23行目と67行目でひっかかりました。 どうすれば解決できますでしょうか。 C言語に詳しい方、よろしくおねがいします。

  • VC++でSQLへSELECT文を送ったのですが…

    #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <string> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; char a; int main(void) { String^ str; SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\○○\\test.mdf;Integrated Security=True;User Instance=True"); sqlConn->Open(); str = "Select test FROM Table1"; SqlCommand^ sqlCmd = gcnew SqlCommand(str,sqlConn);// SqlDataReader^ ExecuteReader (); sqlConn->Close(); } int sub() { a = ExecuteReader; printf (a,"表示テスト\n"); return 0; } の構文でSQL ServerへSELECT文を送り、そこで得た結果を 表示しようと思ったのですが 1>select-test.cpp 1>.\select-test.cpp(28) : error C2065: 'ExecuteReader' : 定義されていない識別子です。 1>.\select-test.cpp(29) : error C2664: 'printf' : 1 番目の引数を 'char' から 'const char *' に変換できません。 (新しい機能 ; ヘルプを参照) 1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは 関数スタイル キャストが必要です。 と2つのエラーを返されてしまいました。 開発環境は OS XPのHomeEditon Visual C++ ExpressEdition SQL Server 2005 Express です。 よろしくお願いします。

  • エラーがとれません 助けてください

    エラーがとれません 助けてください http://cs.fit.edu/~mmahoney/dist/eval4.cpp をコンパイルすると eval4.cpp: In member function ‘bool Attack::read(FILE*)’: eval4.cpp:105: error: ‘strlen’ was not declared in this scope eval4.cpp:114: error: ‘strchr’ was not declared in this scope eval4.cpp: In function ‘int main(int, char**)’: eval4.cpp:132: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:133: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:134: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:183: error: ‘strlen’ was not declared in this scope のようなエラーがでてしまいます。 Ubuntuのg++でコンパイルしています。 なにがまずいのでしょうか?

  • strcpyについて

    strcpyでコピーしたものを配列に入れていきたいのですが、やってみると 「'=' : 'char *' から 'char' に変換することはできません。この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。」とエラーが出ました。 strcpyでコピーしたものを配列に入れることはできないのですか?

専門家に質問してみよう