プロが教える店舗&オフィスのセキュリティ対策術

 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 のすぐ下で宣言と同時に値を代入してはいけないんですか?

A 回答 (4件)

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は関数のいちばん上でなくとも変数宣言できますが、関数内での変数名の管理上、やはり変数は関数のいちばん上で宣言した方がわかりやすいです。

この回答への補足

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

if(hoge){

int x;

}

if(hoge){

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

}

コンパイルできました。

補足日時:2002/04/29 03:03
    • good
    • 0

char *p = newchar[1000];



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

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

なので、エラーが出ないといってる2つの例のうち
下のほうはタイプミスでは?
タイプミスがどうか調べてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
でも、newchar でなく、new char です。

お礼日時:2002/01/31 21:26

case は単にラベルで、ラベル以降、同じスコープに


初期化構文を書けなくなるのが仕様です。

switchの場合は、

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

とすればOKです。
あとブロックを作るか。
    • good
    • 0

VC++を使っているなら、表示されたエラーメッセージをダブルクリックすると、問題となっている文を指摘してくれます。


そうでなくても、コンパイルエラーは何行目がエラーが指摘してくれるので、どこがエラーになっているかは少なくとも自分で確かめたほうがいいでしょう。

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!