Если заявление не вступило в силу - PullRequest
3 голосов
/ 06 апреля 2010
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). Может кто-нибудь сказать мне, почему это? Оператор printw внутри блока If печатает правильный текст, поэтому он назначается правильно. Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 06 апреля 2010

Ваши объявления внутри оператора if скрывают объявления вне его; после выхода оператора if эти скрытые объявления выходят за рамки и исчезают навсегда.

Чтобы обойти это, вы можете сделать что-то вроде

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

Или вы можете использовать такую ​​функцию, как strcpy, чтобы выполнить то же самое.

Это ситуация, когда компиляция с включенными полными предупреждениями показала бы вам ошибку без необходимости публиковать здесь, кстати.

2 голосов
/ 06 апреля 2010

Вы объявляете их как локальные переменные в блоке if. Они не влияют на строки в области действия функции.

1 голос
/ 06 апреля 2010

Вы создаете другой набор локальных переменных с тем же именем (sprite1, sprite2 и т. Д.) В блоке, локальном для if (stype == 1), который скрывает объявления на внешнем уровне.Используйте это вместо:

if (stype == 1)
{
    sprintf(sprite1, "%s", " OO ");
    // etc
}
...