3
void spriteput(int x,int y, int stype)
{
    char sprite1[5]="OOOO";
    char sprite2[5]="OOOO";
    char sprite3[5]="OOOO";
    char sprite4[5]="OOOO";
    if (stype == 1)
    {
        char sprite1[5] = " OO ";
        char sprite2[5] = "OOOO";
        char sprite3[5] = "OOOO";
        char sprite4[5] = " OO ";
        mvprintw(2,y,"%s \n",sprite1);
    }
    mvprintw(x+1,y,"%s \n",sprite2);
    mvprintw(x+2,y,"%s \n",sprite3);
    mvprintw(x+3,y,"%s \n",sprite4);
}

私が正しければ、そのコードブロックはNCURSES画面に出力されます

 OO  
OOOO
OOOO
 OO

ただし、代わりに、デフォルトのテキスト(最初のcharステートメント)を出力します。なぜこれなのか誰か教えてもらえますか?Ifブロック内のprintwステートメントは適切なテキストを出力するため、正しく割り当てられています。前もって感謝します。

4

3 に答える 3

8

ステートメント内の宣言は、ifステートメント外の宣言をシャドウイングしています。ifステートメントが終了すると、それらのシャドウされた宣言はスコープ外になり、永久に失われます。

これを回避するには、次のようなことを行うことができます

if (stype == 1)
{
    sprite1[0] = ' ';
    sprite1[3] = ' ';
    // ...

または、同じことを実行するような関数を使用することもできますstrcpy

ちなみに、これは、完全な警告をオンにしてコンパイルすると、ここに投稿しなくてもエラーが表示される状況です。

于 2010-04-05T22:39:31.460 に答える
2

'if'ブロックでローカル変数として宣言しています。関数スコープの文字列には影響しません。

于 2010-04-05T22:39:24.750 に答える
1

if (stype == 1)外側のレベルで宣言をシャドウするローカルブロックに、同じ名前(sprite1、sprite2など)のローカル変数の別のセットを作成しています。代わりにこれを使用してください:

if (stype == 1)
{
    sprintf(sprite1, "%s", " OO ");
    // etc
}
于 2010-04-05T22:39:47.607 に答える