web-dev-qa-db-ja.com

C:警告:配列初期化子の要素が過剰です。 「xxx」の初期化に近い; 「char *」が必要ですが、タイプは「int」です。

C言語でプログラムをコンパイルしようとしているときに、いくつかの警告があります。

_13:20: warning: excess elements in array initializer [enabled by default]

13:20: warning: (near initialization for ‘litera’) [enabled by default]

22:18: warning: excess elements in array initializer [enabled by default]

22:18: warning: (near initialization for ‘liczba’) [enabled by default]

43:1: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]

45:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]

55:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
_

ソースは次のとおりです。

_char litera[63] = {'E', 'G', 'H', 'F', 'E', 'G', 'H', 'F',
                   'D', 'B', 'A', 'C', 'D', 'B', 'A', 'C', 
                   'B', 'A', 'C', 'D', 'C', 'A', 'B', 'D', 
                   'F', 'H', 'G', 'E', 'F', 'H', 'G', 'E', 
                   'C', 'D', 'B', 'A', 'B', 'A', 'C', 'D', 
                   'F', 'E', 'G', 'H', 'G', 'H', 'F', 'G', 
                   'H', 'F', 'E', 'F', 'H', 'G', 'E', 'C',
    /*line13:*/    'A', 'B', 'D', 'C', 'A', 'B', 'D', 'E'};

int liczba[63] ={'8', '7', '5', '6', '4', '3', '1', '2', 
                 '1', '2', '4', '3', '5', '6', '8', '7', 
                 '5', '7', '8', '6', '4', '3', '1', '2', 
                 '1', '2', '4', '3', '5', '6', '8', '7', 
                 '6', '8', '7', '5', '3', '1', '2', '4', 
                 '3', '1', '2', '4', '6', '8', '7', '5', 
                 '7', '8', '6', '4', '3', '1', '2', '1', 
    /*line22*/   '2', '4', '3', '5', '6', '8', '7', '5'};


int i=0, x=0, n;
char a;
int b=0;
printf("Podaj literę z pola startowego skoczka(duże litery)\n");
scanf("%s", &a);
printf("Podaj liczbę z pola startowego skoczka \n");
scanf("%d", &b);

if (b<=0 || b>8){
    printf("Zła pozycja skoczka\n");
    return 0;
    }

while (litera[i] != a || liczba[i] != b){
    ++i;
    }
n=i;

/*line43*/ printf("Trasa skoczka od punktu %s %d to:\n", a, b); 
while (i<=64){
/*line45*/ printf("%s%d ", litera[i], liczba[i]);
    ++i;

    ++x;
    x=x%8;
    if(x==0)
        printf("/n");
    }
i=0;
while (i<n){
/*line55*/ printf("%s%d ", litera[i], liczba[i]);

    ++i;

    ++x;
    x=x%8;
    if(x==0)
        printf("/n");
    }
_

また、scanf("%d", &b);の後に「コアダンプ」がありますが、_int b=0;_は問題になりません。

6
wojteo

ここで2つのエラー:最初に、64個の要素を格納するために_arrays[63]_を宣言しようとしています。おそらく、配列のサイズ(n)と可能な最大のインデックス値(つまり_n - 1_)。したがって、間違いなく_litera[64]_および_liczba[64]_である必要があります。ところで、この行も変更する必要があります--while (i<=64):そうしないと、65th要素にアクセスしようとすることになります。

次に、ここでは_%s_を使用する必要がありますが、char値にscanfの_%c_形式指定子を入力しようとしています。

また、なぜliczba配列をintsを格納する配列として宣言し、charsの配列で初期化するのか疑問に思わずにはいられません。これらすべての「1」、「2」などのリテラルは、対応する数字ではなく、それらの文字コードを表します。それがあなたの意図だったとは思えません。

7
raina77ow