• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:下記のプログラムがコンパイラでエラーになります。)

プログラムのコンパイルエラー対処方法

このQ&Aのポイント
  • プログラムのコンパイルエラーが発生しました。エラーメッセージは「expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘main’」です。
  • エラーメッセージの原因は、関数の宣言が正しく行われていないことです。
  • 関数の宣言を修正することでコンパイルエラーを解消できます。

質問者が選んだベストアンサー

  • ベストアンサー
  • kerneru
  • ベストアンサー率37% (45/120)
回答No.1

「自分でよく見てみろ。」 ちなみに私の環境でコンパイルしたら、エラーが量産されました。 エラー E2451 test.cpp 19: 未定義のシンボル intkekka(関数 intstr_cmp(char *,char *) ) エラー E2451 test.cpp 29: 未定義のシンボル kekka(関数 intstr_cmp(char *,char *) ) エラー E2451 test.cpp 73: 未定義のシンボル chartemp(関数 voidstr_change(char *,char *) ) エラー E2451 test.cpp 73: 未定義のシンボル DATA_LEN(関数 voidstr_change(char *,char *) ) エラー E2379 test.cpp 77: ステートメントにセミコロン(;)がない(関数 voidstr_change(char *,char *) ) エラー E2268 test.cpp 79: 未定義の関数 'str_cpy' を呼び出した(関数 voidstr_change(char *,char *) ) エラー E2451 test.cpp 81: 未定義のシンボル temp(関数 voidstr_change(char *,char *) ) 警告 W8070 test.cpp 85: 関数は値を返すべき(関数 voidstr_change(char *,char *) ) 警告 W8070 test.cpp 115: 関数は値を返すべき(関数 voidstr_cpy(char *,char *) )

offikou
質問者

お礼

そうですね。 かと言って他の言語も知りませんが、C言語は難しい、と感じます。 仕事として今は必要がないからかも知れませんが達成感などないです。 極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。 それは私にはハードルが高過ぎでしょう。 でもありがとうございました。

その他の回答 (4)

回答No.5

おや、頻繁に出て来る質問の「for(;*ps != '\0';ps++,pd++)」の書き方が上級者風(ps++,pd++)っていうのもアンバランスで面白いですね。 また、for() の初期値を「 ; 」だけでクリアする使い方も気に入りました。 ただ、それは while() に変更するとプログラムの見通しが良くなるように思います。 /* int, void, スペースをきちんと書くと こんな感じになりました。 */ #include <stdio.h> #define N 7 #define ON 1 #define OFF 0 #define DATA_LEN 20 /* プロトタイプ宣言 */ void printData(char p[][DATA_LEN], int n); void sort(char p[][DATA_LEN], int n); void str_change(char *ps1, char *ps2); void str_cpy(char *pd, char *ps); int str_cmp(char *ps1, char *ps2); int main(void) { char p_data[N][DATA_LEN] ={"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"}; printData(p_data,N); sort(p_data,N); printf("\nソートしました\n\n"); printData(p_data,N); return 0; } void printData(char p[][DATA_LEN], int n) { int i; for(i=0;i<n;i++) printf("%s\n",p[i]); } void sort(char p[][DATA_LEN], int n) { int sw; int i,j; sw = ON; for(i = n-1; i>=1 && sw == ON; i--){ sw = OFF; for(j = 0; j< i; j++){ if(str_cmp(p[j],p[j+1]) > 0){ str_change(p[j],p[j+1]); sw = ON; } } } } int str_cmp(char *ps1, char *ps2) { int kekka; while(*ps1 && *ps2 && *ps1==*ps2) ps1++,ps2++; //for(; *ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2; ps1++,ps2++); if(*ps1 > *ps2) kekka = 1; else if(*ps1 == *ps2) kekka = 0; else kekka = -1; return kekka; } void str_change(char *ps1, char *ps2) { char temp[DATA_LEN]; str_cpy(temp,ps1); str_cpy(ps1,ps2); str_cpy(ps2,temp); } void str_cpy(char *pd, char *ps) { while(*pd++=*ps++); //for(;*ps != '\0';ps++,pd++) // *pd = *ps; //*pd = '\0'; }

offikou
質問者

お礼

そうですね。 かと言って他の言語も知りませんが、C言語は難しい、と感じます。 仕事として今は必要がないからかも知れませんが達成感などないです。 極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。 それは私にはハードルが高過ぎでしょう。 まだC言語って何者かがつかめません。 でもありがとうございました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.4

実際のソースをちゃんと貼り付けないとどうにもなりませんよ。 >kansuu4.c: In function ‘atr_cpy’: このエラーに該当するところはないし。

offikou
質問者

お礼

まだC言語って何者かがつかめません。 Windowsでやる場合とEmacsでやる場合でコンパイルが違う結果になるような気がします。 とにかく解っていませんが、ありがとうございます。

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.3

タイプミスを直せば動きます。 あとは、無駄な改行とコメントを省くこと。そうすれば、一回で投稿できます。 #include <stdio.h> #define N 7 #define ON 1 #define OFF 0 #define DATA_LEN 20 void printData(char p[][DATA_LEN], int n); void sort(char p[][DATA_LEN], int n); void str_change(char *ps1,char *ps2); void str_cpy(char *pd,char *ps); int str_cmp(char *ps1,char *ps2); void main(){ char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"}; printData(p_data,N); sort(p_data,N); printf("\nソ\ートしました\n\n"); printData(p_data,N); } void printData(char p[][DATA_LEN], int n){ int i; for(i=0;i<n;i++){ printf("%s\n",p[i]); } } void sort(char p[][DATA_LEN],int n){ int sw; int i,j; sw = ON; for(i = n-1 ; i>=1 && sw == ON ; i--){ sw = OFF; for(j = 0; j< i ;j++){ if(str_cmp(p[j],p[j+1]) > 0){ str_change(p[j],p[j+1]); sw = ON; } } } } int str_cmp(char *ps1,char *ps2){ int kekka; for(;*ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2 ;ps1++,ps2++); if(*ps1 > *ps2){ kekka = 1; }else if(*ps1 == *ps2){ kekka = 0; }else{ kekka = -1; } return kekka; } void str_change(char *ps1,char *ps2){ char temp[DATA_LEN]; str_cpy(temp,ps1); str_cpy(ps1,ps2); str_cpy(ps2,temp); } void str_cpy(char *pd,char *ps){ for(;*ps != '\0';ps++,pd++){ *pd = *ps; } *pd = '\0'; }

offikou
質問者

お礼

もはや難しすぎるって現状です。 とにかく、ありがとうございました。

noname#29459
noname#29459
回答No.2

そもそも、ちゃんと cut&paste してないので、オリジナルソースがみえてませんが。 instr_comp て関数宣言からして変ですが。 さらに、ソースがまともに表示できてないので行番との対応付けは、回答者がするの? 結論としては、質問のしかたが、なっちゃいないと思う。

offikou
質問者

お礼

もう色んな方に質問を丸投げしてしまって こんな結果になりました。 本当に申し訳ございません。 今後は一つ一つやって行きます。