1

テキストファイルを行ごとに処理するプログラムを作成していますが、ファイルの最初の行は、ファイルの長さ (ヘッダー) を示す単一の int です。問題は、ファイルの残りの部分に関する情報を格納する配列を定義しようとしているのですが、city_info と city_dist で未定義のエラーが発生し続けることです。私が見逃しているものはありますか?

コードは次のとおりです。

    while(fgets(buffer,MAX_LINE,fp)!=NULL) {
    if(firsttime){
        int num_city = atoi(buffer);
        printf("NUMBER OF CITIES = %d\n",num_city);
        node city_info[num_city]; /*compiler says these are undefined*/
        int city_dist[num_city]; /*compiler says these are undefined*/
        firsttime=FALSE;
    }
    .
    .
    .
    /*rest of code*/

これが私が得ているコンパイラエラーです:

help.c: In function `main':
help.c:33: warning: unused variable `city_info'
help.c:34: warning: unused variable `city_dist'
help.c:41: error: `city_info' undeclared (first use in this function)
help.c:41: error: (Each undeclared identifier is reported only once
help.c:41: error: for each function it appears in.) 
help.c:42: error: `city_dist' undeclared (first use in this function)

編集:変数を使用していないと言っている人のために、後でコードで使用しました

4

3 に答える 3

1

if ブロックのスコープで定義された変数は、このスコープの外では見えません。これを試して:

int num_city;
node *city_info = null;
int *city_dist = null;
if(firsttime) {
    num_city = atoi(buffer);
    city_info = malloc(num_city * sizeof(node));
    city_dist = malloc(num_city * sizeof(int));
    // check if malloc actually worked...

    //...
}

//...
// clean up!
if (city_info != null) free(city_info);
if (city_dist != null) free(city_dist);
于 2013-10-15T13:54:27.217 に答える
0

C89 モードでコンパイルしている (そして GCC 拡張機能を持っていない) 場合、これは有効ではありません。
ただし、コンパイラが C99 モードをサポートしている場合、ステートメントの後 (または任意のブロック内) で変数を宣言することは完全に合法です。

変数を使用していないと言っている人のために、後でコードで使用しました

ケース variable に注意してくださいnum_citycity_info[num_city]およびcity_dist[num_city]ブロックスコープがあり、スコープ外にアクセスすることはできませんif(他のスコープからは見えないため)。また、city_info[num_city]とは、C99 のみでサポートされてcity_dist[num_city]いる可変長配列です

于 2013-10-15T14:03:11.427 に答える