ABA
@ABA (A)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コンパイラエラーの解決

Q&A

解決したいこと

人口密度の上位10都道府県を出力するプログラムを作成しています。コンパイルすると今まで出てきたことのないエラーが出てきます。調べてみると全角の空白がある場合に出るエラーとなっていましたが、理解ができず、その後進めません。プログラムを完成させる上で、エラーの状況を理解したいと考えます。解決方法をご教示お願いします。

発生している問題・エラー

出ているエラーメッセージを入力
ex_07_01.c: In function 'print_data':
ex_07_01.c:15:3: error: stray '\343' in program
    printf(" %s %lf\n",p->name, (double)p->popu*10000/(double)p->area);
   ^
ex_07_01.c:15:3: error: stray '\200' in program
ex_07_01.c:15:3: error: stray '\200' in program
ex_07_01.c: In function 'sort_by_density':
ex_07_01.c:33:1: error: stray '\343' in program
    for (i=0; i<n; i++) {
 ^
ex_07_01.c:33:1: error: stray '\200' in program
ex_07_01.c:33:1: error: stray '\200' in program
ex_07_01.c:35:25: error: 'prefecture' has no member named 'density'
             if  (data[j]->density > data[j-1]->density)
                         ^
ex_07_01.c:35:46: error: 'prefecture' has no member named 'density'
             if  (data[j]->density > data[j-1]->density)
                                              ^
ex_07_01.c: At top level:
ex_07_01.c:42:1: error: expected identifier or '(' before '}' token
 }
 ^
ex_07_01.c: In function 'main':
ex_07_01.c:63:4: error: unknown type name 'sort_by_'
    sort_by_ density(N, data_p);
    ^
ex_07_01.c:4:11: error: expected declaration specifiers or '...' before numeric constant
 #define N 47
           ^
ex_07_01.c:63:21: note: in expansion of macro 'N'
    sort_by_ density(N, data_p);
                     ^
ex_07_01.c:63:24: error: expected declaration specifiers or '...' before 'data_p'
    sort_by_ density(N, data_p);
                        ^

例)

NameError (uninitialized constant World)
```

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

#include <stdio.h>
#include <string.h>

#define N 47
#define SIZE 256

typedef struct {
    int id;
    char name[SIZE];
    int area;
    int popu;
} prefecture;

void print_data(prefecture *p) {
   printf(" %s %lf\n",p->name, (double)p->popu*10000/(double)p->area);
}

prefecture set_data(int id, char name[], int area, int popu) {
    prefecture data;

    data.id = id;
    strcpy(data.name, name);
    data.area = area;
    data.popu = popu;

    return data;
}

void sort_by_density(int n, prefecture *data[]) {
    prefecture  *tmp;
    int i, j;

   for (i=0; i<n; i++) {
        for (j=n-1; j>i; j--){
            if  (data[j]->density > data[j-1]->density)
                tmp = data[j];
                data[j] = data[j-1] ;
                data[j-1] = tmp;
            }
        }
    }
}

int main(void) {
    FILE *fin;
    prefecture data[N], *data_p[N];
    char file[SIZE], name[SIZE];
    int area, i, id, popu;

    scanf("%s", file);
    if ((fin = fopen(file, "r")) == NULL) {
        printf("Can't open the file.\n");
        return 1;
    }

    for (i=0; i<N; i++) {
        fscanf(fin, "%d %s %d %d",&id, name, &area, &popu);
        data[i] = set_data(id, name, area, popu);
        data_p[i] = &data[i];
    }


   sort_by_ density(N, data_p);
   for (i=0; i<10; i++) print_data(data_p[i]);

   fclose(fin);

    return 0;
}

自分で試したこと

全角の空白があるとの事だったので、エラーが出ている付近を削除してみた。

0

1Answer

エディタで検索すると解りますが、
以下の「★」に全角スペースが存在します。

void print_data(prefecture *p) {
  printf(" %s %lf\n",p->name, (double)p->popu*10000/(double)p->area);
}

prefecture set_data(int id, char name[], int area, int popu) {
    prefecture data;

    data.id = id;
    strcpy(data.name, name);
    data.area = area;
    data.popu = popu;

    return data;
}

void sort_by_density(int n, prefecture *data[]) {
    prefecture  *tmp;
    int i, j;

  for (i=0; i<n; i++) {
        for (j=n-1; j>i; j--){
            if  (data[j]->density > data[j-1]->density)
                tmp = data[j];
                data[j] = data[j-1] ;
                data[j-1] = tmp;
            }
        }
    }
}

0Like

Comments

  1. @ABA

    Questioner

    ありがとうございました。
    質問のエラーに関しては以下のように解決いたしました。
    さらに質問させていただいてもよろしいでしょうか。以下のコンパイラーの失敗に'...'と書かれてます。この意味がわからないのですが。その他、コンパイラエラーになっている理由でお分かりになる箇所がありましたら、ご教示いただけたらと思います。


    コンパイルに失敗しました
    ex_07_01.c: In function 'print_data':
    ex_07_01.c:15:6: warning: unknown conversion type character 0x20 in format [-Wformat=]
    printf(" %s%. %lf\n",p->name, (double)p->popu*10000/(double)p->area);
    ^
    ex_07_01.c: In function 'main':
    ex_07_01.c:63:4: error: unknown type name 'sort_by_'
    sort_by_ density(N, data_p);
    ^
    ex_07_01.c:4:11: error: expected declaration specifiers or '...' before numeric constant
    #define N 47
    ^
    ex_07_01.c:63:21: note: in expansion of macro 'N'
    sort_by_ density(N, data_p);
    ^
    ex_07_01.c:63:24: error: expected declaration specifiers or '...' before 'data_p'
    sort_by_ density(N, data_p);
    ^
  2. `sort_by_`と`density(N, data_p);`の間に空白文字があるので、エラーしているのではないでしょうか。
  3. @ABA

    Questioner

    ありがとうございました。以下のような結果になりました。まだ、問題は残っているという事でしょうか。

    コンパイルに成功しました(警告あり)
    ex_07_01.c: In function 'print_data':
    ex_07_01.c:15:6: warning: unknown conversion type character 0x20 in format [-Wformat=]
    printf(" %s%. %lf\n",p->name, (double)p->popu*10000/(double)p->area);
    ^
  4. warning: unknown conversion type character 0x20 in format [-Wformat=]
    printf(" %s%. %lf\n",p->name, (double)p->popu*10000/(double)p->area);

    「書式制御文字列の中に未知のフォーマット指定子"0x20(空白文字)"がある」と言われています。
    書式制御文字列" %s%. %lf\n"を見ると、"%s"、"%. "、"%lf"と3個の"%"があり、それぞれ"s"、" "、"f"というフォーマット指定子が使われています。
    このうちの二つ目"%. "が警告の対象です。
  5. @ABA

    Questioner

    ありがとうございます。エラーが消えました。さらに質問させていただきます。小数点以下1桁までの出力にしたいのですが、現状そのようになっておりません。申し訳ありませんが問題箇所をご教示頂けますでしょうか。
  6. 一般的な情報になりますので、以下の記事とかを読み込んでみてください。
    https://www.k-cube.co.jp/wakaba/server/format.html
    「C フォーマット指定子」や「C printf」で検索すると、他にも見つかると思います。

    お読みいただいてもご不明な箇所があれば、ご遠慮なくお尋ねください。
  7. @ABA

    Questioner

    ありがとうございました。理解ができました。
  8. 僅かでもお役に立てたなら何よりです。

Your answer might help someone💌