OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

case で宣言コンパイルエラー

  • 暇なときにでも
  • 質問No.203640
  • 閲覧数239
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 59% (194/328)

 switch (msg){
 case WM_LBUTTONDOWN:
  char *p = new char[1000];
  wsprintf(p, "%d" , i);
  MessageBox(hWnd , p , "" , MB_OK);
  delete[] p;
 break;

がエラーで

 switch (msg){
 case WM_LBUTTONDOWN:
  char *p;
  p = new char[1000];
  wsprintf(p, "%d" , i);
  MessageBox(hWnd , p , "" , MB_OK);
  delete[] p;
 break;



 switch (msg){
 case WM_KEYDOWN:
  if( wParam == VK_RETURN ){
   char *p = new char[1000];
   wsprintf(p, "%d" , i);
   MessageBox(hWnd , p , "" , MB_OK);
   delete[] p;
  }
 break;

ならエラーじゃなかったんだけど、理由がよく分かりません。
case のすぐ下で宣言と同時に値を代入してはいけないんですか?
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全4件)

  • 回答No.1
レベル12

ベストアンサー率 40% (230/562)

VC++を使っているなら、表示されたエラーメッセージをダブルクリックすると、問題となっている文を指摘してくれます。 そうでなくても、コンパイルエラーは何行目がエラーが指摘してくれるので、どこがエラーになっているかは少なくとも自分で確かめたほうがいいでしょう。 少なくとも、この部分だけでは、switch内で変数を宣言し、初期化したことによるエラーはありえません。
VC++を使っているなら、表示されたエラーメッセージをダブルクリックすると、問題となっている文を指摘してくれます。
そうでなくても、コンパイルエラーは何行目がエラーが指摘してくれるので、どこがエラーになっているかは少なくとも自分で確かめたほうがいいでしょう。

少なくとも、この部分だけでは、switch内で変数を宣言し、初期化したことによるエラーはありえません。


  • 回答No.2
レベル4

ベストアンサー率 50% (1/2)

case は単にラベルで、ラベル以降、同じスコープに 初期化構文を書けなくなるのが仕様です。 switchの場合は、 switch( value ){ int i = 0; char* p = NULL; case X: とすればOKです。 あとブロックを作るか。
case は単にラベルで、ラベル以降、同じスコープに
初期化構文を書けなくなるのが仕様です。

switchの場合は、

switch( value ){
int i = 0;
char* p = NULL;
case X:

とすればOKです。
あとブロックを作るか。
  • 回答No.3
レベル6

ベストアンサー率 37% (3/8)

char *p = newchar[1000]; は明らかにおかしいです! pはポインタ変数で宣言されてるので &newchar[1000]のように 変数のアドレス値を代入しなければいけません。 値を入れようとするとエラーが出ます。 なので、エラーが出ないといってる2つの例のうち 下のほうはタイプミスでは? タイプミスがどうか調べてみてください。 ...続きを読む
char *p = newchar[1000];

は明らかにおかしいです!

pはポインタ変数で宣言されてるので &newchar[1000]のように
変数のアドレス値を代入しなければいけません。
値を入れようとするとエラーが出ます。

なので、エラーが出ないといってる2つの例のうち
下のほうはタイプミスでは?
タイプミスがどうか調べてみてください。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
でも、newchar でなく、new char です。
投稿日時 - 2002-01-31 21:26:51
  • 回答No.4
レベル12

ベストアンサー率 40% (230/562)

new char[1000] は (char*)malloc(1000) と同値なので、構文上の間違いはありません。 とにかく、この文をコピーしただけではエラーは起こりえないので、これ以前のコードを補足するか、エラーのあった行を自分で調べるかしてください。 ちなみにifは新しいスコープを作らないので、ブロックであってもその1つ上のスコープをもっています。 例を挙げると、 ...続きを読む
new char[1000]



(char*)malloc(1000)

と同値なので、構文上の間違いはありません。
とにかく、この文をコピーしただけではエラーは起こりえないので、これ以前のコードを補足するか、エラーのあった行を自分で調べるかしてください。

ちなみにifは新しいスコープを作らないので、ブロックであってもその1つ上のスコープをもっています。
例を挙げると、

if(hoge){

int x;

}

if(hoge){

int x; //すでに宣言されているのでエラー

}

while(hoge){

int y;

}

while(hoge){

int y; //違うスコープなのでエラーでない

}

この辺がおそらく原因だと思うのですが・・・。
最近のCは関数のいちばん上でなくとも変数宣言できますが、関数内での変数名の管理上、やはり変数は関数のいちばん上で宣言した方がわかりやすいです。
補足コメント
A__

お礼率 59% (194/328)

ありがとうございます。
でも、やってみると

if(hoge){

int x;

}

if(hoge){

int x; //エラーにならず

}

コンパイルできました。
投稿日時 - 2002-04-29 03:03:56
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ