C言語のオーバーフローについて

このQ&Aのポイント
  • C言語でのオーバーフローに関する問題を解決する方法を教えてください。
  • csvファイルのデータを読み取り、計算させるプログラムで、行数が増えると「StuckOverFlowReception」というエラーメッセージが表示されます。
  • 静的に領域を確保していることが原因かもしれませんが、具体的にどこがオーバーフローしているのか、修正方法を教えてください。プログラム初心者なので、分かりやすく教えていただけると助かります。
回答を見る
  • ベストアンサー

C言語のオーバーフローについて

csvからデータを読み取り、計算させるプログラムで、行が多くなると「StuckOverFlowReception」と表示されます。静的に領域を確保していることに原因があるような気がするのですが、どこがオーバーフローしているのか、どう直せばよいのかがわかりません。改善のご指摘をお願いします。 VisualStudio2010をwindows7で使用しています。プログラム初心者なので、かなりみにくいかもしれません。すいません。ちなみに15行ぐらいにするとオバーフローと表示されます。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 20//行数の定義 #define M 2048//列数の定義 int main() { char *fname = "ttt.csv"; //読み取り用ファイル char *ffname = "tk.csv"; //読み取り用ファイル FILE *IN1, *IN2, *OUT1, *OUT2; char buff[30000]; //配列を静的に確保(桁が大きいので、大きくとっています) char *pbuff; //読み取ったデータを格納する用 char arv[600]; //ffnameの配列用 char *parv; //arv[]の格納用 double a[N][M+30], b[N][M], c[N][M], w[4][32]; //配列の領域を定義 int i, j, x; //for文の繰り返し用 double m, n; //計算結果の一時的な格納用 if((IN1 = fopen(fname, "r")) == NULL){  ////ファイルを開く↓ printf("can't open the %s", fname); return 0; } if((IN2 = fopen(ffname, "r")) == NULL){ printf("can't open the %s", ffname); return 0; } if((OUT1 = fopen("high wavelet.csv", "w")) == NULL){ printf("can't open the ha.csv"); return 0; } if((OUT2 = fopen("low wavelet.csv", "w")) == NULL){ printf("can't open the la.csv"); return 0; }                         ////ファイルを開く↑ i=j=0; //配列の取得↓ while(fgets(buff, 30000, IN1) != NULL){ //csvデータ1行読み込みの繰り返し pbuff = buff; while((pbuff = strtok(pbuff, ",\n")) != NULL){ //pbuffのデータを区切る a[i][j++] = strtod(pbuff, NULL); //,をとばして配列に格納 pbuff = NULL; } i++; j=0; } i=j=0; //上の作業と同じ↓ while(fgets(arv, 600, IN2) != NULL){ parv = arv; while((parv = strtok(parv, ",\n")) != NULL){ w[i][j++] = strtod(parv, NULL); parv = NULL; } i++; j=0; }          ///ここまででcsvを配列に格納完了 x=0;                //計算上必要な       for(i=0; i<N; i++){         //作業をしてる for(j=0; j<30; j++){    //だけなので、ここは a[i][M+j] = a[i][j];//無視してください } } for(i=0; i<N; i++){        //ここから実際の計算 for(j=0; j<M; j++){  //計算長くてすいません m = (a[i][j]*w[0][0] + a[i][j+1]*w[0][1] + a[i][j+2]*w[0][2] + a[i][j+3]*w[0][3] + a[i][j+4]*w[0][4] + a[i][j+5]*w[0][5] + a[i][j+6]*w[0][6] + a[i][j+7]*w[0][7] + a[i][j+8]*w[0][8] + a[i][j+9]*w[0][9] + a[i][j+10]*w[0][10] + a[i][j+11]*w[0][11] + a[i][j+12]*w[0][12] + a[i][j+13]*w[0][13] + a[i][j+14]*w[0][14] + a[i][j+15]*w[0][15] + a[i][j+16]*w[0][16] + a[i][j+17]*w[0][17] + a[i][j+18]*w[0][18] + a[i][j+19]*w[0][19] + a[i][j+20]*w[0][20] + a[i][j+21]*w[0][21] + a[i][j+22]*w[0][22] + a[i][j+23]*w[0][23] + a[i][j+24]*w[0][24] + a[i][j+25]*w[0][25] + a[i][j+26]*w[0][26] + a[i][j+27]*w[0][27] + a[i][j+28]*w[0][28] + a[i][j+29]*w[0][29] + a[i][j+30]*w[0][30] + a[i][j+31]*w[0][31]); n = (a[i][j]*w[1][0] + a[i][j+1]*w[1][1] + a[i][j+2]*w[1][2] + a[i][j+3]*w[1][3] + a[i][j+4]*w[1][4] + a[i][j+5]*w[1][5] + a[i][j+6]*w[1][6] + a[i][j+7]*w[1][7] + a[i][j+8]*w[1][8] + a[i][j+9]*w[1][9] + a[i][j+10]*w[1][10] + a[i][j+11]*w[1][11] + a[i][j+12]*w[1][12] + a[i][j+13]*w[1][13] + a[i][j+14]*w[1][14] + a[i][j+15]*w[1][15] + a[i][j+16]*w[1][16] + a[i][j+17]*w[1][17] + a[i][j+18]*w[1][18] + a[i][j+19]*w[1][19] + a[i][j+20]*w[1][20] + a[i][j+21]*w[1][21] + a[i][j+22]*w[1][22] + a[i][j+23]*w[1][23] + a[i][j+24]*w[1][24] + a[i][j+25]*w[1][25] + a[i][j+26]*w[1][26] + a[i][j+27]*w[1][27] + a[i][j+28]*w[1][28] + a[i][j+29]*w[1][29] + a[i][j+30]*w[1][30] + a[i][j+31]*w[1][31]); b[i][x] = m; //配列×配列をしてm、nに一時的に格納し c[i][x] = n; //新たな配列に入れてます x++; j++; } x=0; } for(i=0; i<N; i++){       //ここから新たに得た配列をcsvに書き込んでいます for(j=0; j<(M/2); j++){ fprintf(OUT1, "%e", b[i][j]); fprintf(OUT2, "%e", c[i][j]); if(j==(M/2-1)){ fprintf(OUT1, "\n"); fprintf(OUT2, "\n"); }else{ fprintf(OUT1, ","); fprintf(OUT2, ","); } } } fclose(IN1); fclose(IN2); fclose(OUT1); fclose(OUT2); rewind(stdin); getchar(); return 0; }

noname#244557
noname#244557

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

「StuckOverFlow」辺りで検索すると出てくると思いますが……。 一般的にローカル変数はスタック領域に作成される事が多いです。 そして、VisualStudioではスタック領域は1M程度確保される場合が多いようです。 そんなワケで、「ローカル変数に大量のメモリを使用する」と、スタックオーバーフローになることがあります。 対処方法は3通り…ですかね。 ・リンカーオプションでスタック領域を大きくする。(どっかで限界来ますけどねぇ…) ・グローバル変数にする。(どっからでも書き換えできてウマー。知らないうちに書き換えられてあれぇ???) ・静的変数にする。(グローバル変数よりはマシでしょう) ・ヒープ領域から動的確保する。(ポインタ使う事になりますが。多次元配列だと工夫が必要でしょう。) ヒープから確保する。ってのが一般的な対処方法でしょうね。 次点が静的変数でしょうか。 # double a[N][M+30], b[N][M], c[N][M], w[4][32]; ではなく # static double a[N][M+30], b[N][M], c[N][M], w[4][32]; となる。

noname#244557
質問者

お礼

スタック領域を増やすことは検討したのですが、やはり限界があることから、動的に確保すべきかもしれません。ただ、原因の変数がわかれば、それだけの変更でよかったのですが、わからないだけに、とりあえずプログラム書き換えよう… と、思って、試しで静的変数にしたとたん一気に行数が増えました!確認したまでで200までいけます。 staticなので格納領域が毎度初期化されない?からよかったのでしょうか? とにかく、策をわざわざ考えていただきありがとうございます!

その他の回答 (5)

  • honor
  • ベストアンサー率35% (25/71)
回答No.6

「1度に使うのが1行」なら csvのデータを全部読み込んでから纏めて計算するのではなく csvのデータを1行読み込んでその行を計算して出力→次の行を読み込む というふうにすればいいということではないでしょうか。

noname#244557
質問者

お礼

あー、なるほど! データを格納して残していくのではなく、1行計算したら、上から書き換えていくってことですね?確かにそれなら1行分の領域を確保するだけで済みますね。かなりいい考え方ですね。ありがとうございます!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「数百行あるので、なるべく沢山で計算できたらと…」の意味がさっぱり分からない. 何百万行あろうと「一度に 1行しか使わない」のであれば「今現在の処理に必要な 1行」だけをおぼえておけばいい. 少なくとも, この質問で挙がっているプログラムについてはその通りでしょ? ついでにいうと, 場合によっては fgets を使わなくて済むかもしれない.

noname#244557
質問者

お礼

すいません。つまり、「1行計算して出力」を1度の実行で何行分もやりたいってことです。要は、何度も実行するのがめんどくさいっていうわがまま…もしかして、1行計算できれば、もっと簡単な方法で多数の行を計算できる方法があるっていうことですが? だとすれば自分の勉強不足が甚だしいですね。申し訳ないです。 とりあえず静的変数にして行数は増えました。 考えてくださりありがとうございます!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

a に入れるべきデータを, なぜ全部読み込まなければならないのですか?

noname#244557
質問者

補足

列は2048データ固定で、wevelet変換という1行まるまる使って計算する手法を使ってます。なので、行に関しては、何度も同じ計算をして、最終的に同csvにコピーすればいいのですが、数百行あるので、なるべく沢山で計算できたらと…

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

Mは本当は2048もいらないのでは? だったら malloc を勉強して動的にとれば実際のデータ分だけで済みます。

noname#244557
質問者

補足

データは2048個固定です。 一応 char buff[] → char *buff; while(fgets(buff, 30000, IN1) != NULL){ buff = (char*)malloc(30000); pbuff = buff; while((pbuff = strtok(pbuff, ",\n")) != NULL){ a[i][j++] = strtod(pbuff, NULL); pbuff = NULL; } i++; j=0; free(buff); } でやったのですが、同じでした。

noname#190876
noname#190876
回答No.2

double a[N][M+30], b[N][M], c[N][M], w[4][32]; //配列の領域を定義 この行の領域割り当てが多きすぎるので、これを、 double a[N][M+30], b[N][M], c[N][M], w[4][32]; //配列の領域を定義 main() { } と、mainの外、しかし、同一ファイル内に移してみて下さい。

noname#244557
質問者

お礼

参考書に、1つの関数に詰め込みすぎると予期せぬことが起こりやすいと書いてありました。やはりそれも原因の1つなのでしょうか。ご指摘のように関数を変えたり、より計算が楽になるような工夫をしてみようと思います。 ご指摘ありがとうございます!

関連するQ&A

  • C言語の領域確保について

    C言語を始めたばかりのものです。 配列を計算させようと下のようなプログラムを作り、一応動作はするのですが、配列の領域確保がいまいちわかりません。配列はcsvから値をとっています。確保する領域は、代入する値の数でいいので、buff[8×64]、とかarv[4×32]でいいと思い、それより少し大きな値くらいで実行すると失敗してしまいます。  自分の理解の仕方が間違っているとは思っているのですが、(char *)malloc(M*N*sizeof(char))でやっても失敗しました。どうすればよいかお教え願います。ちなみに、csvの値は0.000852354710804709のように桁が半端ないです。  またfgetsのライン数の値も正しくするにはどうすればよいのでしょうか。できたらmallocを使えたらよいと思っています。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 8 //8行 #define M 64 //64列 int main() { char *fname = "test.csv";//8行64列 char *ffname = "tk.csv";//4行32列 FILE *IN1, *IN2, *OUT1, *OUT2; char buff[100000];//←問題の部分 char *pbuff; char arv[400];//←問題の部分 char *parv; double a[N][M+30], b[N][M], c[N][M], w[4][32]; int i, j, x; double m, n; int count=0; if((IN1 = fopen(fname, "r")) == NULL){ printf("can't open the %s", fname); return 0; } if((IN2 = fopen(ffname, "r")) == NULL){ printf("can't open the %s", ffname); return 0; } i=j=0;//配列の取得 while(fgets(buff, 100000, IN1) != NULL){ pbuff = buff; while((pbuff = strtok(pbuff, ",\n")) != NULL){ a[i][j++] = strtod(pbuff, NULL); pbuff = NULL; } i++; j=0; } i=j=0;//配列の取得 while(fgets(arv, 400, IN2) != NULL){ parv = arv; while((parv = strtok(parv, ",\n")) != NULL){ w[i][j++] = strtod(parv, NULL); parv = NULL; } i++; j=0; }             :             :             : このプログラムでも計算はできるのでいいのですが、最終的には500行2048列の計算をしないといけないので、いっそう数字が膨大となるために質問させていただきました。Visual Stdio 2010 c/c++ 使ってます。

  • C言語 csv 配列

    CSVファイルを2次元配列に格納したいのですが、書き方がわかりません。 csvファイルは1024×2048の0と1のみで構成されています。 fp=fopen(path,"r"); for(j=0; j<1024; j++) { for(i=0; i<2048; i++) { char c; do{c=(getc(fp));} while(c==','||c=='\n'||c=='\r'); map[j][i] = c-'0'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

  • 型によらないCSVファイルの読み込みC言語プログラ

    あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか

  • Cで2次元配列にCSVファイルを格納するには?

    ~.csvというファイルがあって、ファイルの中身は256*256のある数字の2次元配列です。 このファイルを読み込んで、2次元配列に格納したいのですが、どのようなソースを書けばいいのでしょうか? プログラミングをちゃんと勉強してこなかったために苦戦しています。 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ FILE *fi; char I[256]; char J[256]; if((fi=fopen("ch.csv","r"))==NULL){//csvもこのような記述でよみこむことができるのか? printf("ファイルオープンエラー\n"); exit(1); } while(fgets(J,256,fi) != NULL) { これより先が全く書けていない状態です。 ここまでもこのソースで大丈夫でしょうか? かなり基本的なことだと思いますが、よろしくお願いします。

  • C言語 strtok

    失礼します。現在こちらでアドバイスを頂きfgetcを使用して配列に格納をすることができたのですが、CSVをカンマ区切りで格納したいのですが上手くいかず困っています。strtokを使用方法をドキュメントを読んでもうまく区切ったものを配列に入れる方法がわかりません 何卒よろしくお願いします。 ソースコード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define MAXITEM 1400 int split(char *str, const char *delim, char *outlist[]) { char *tk; int cnt = 0; tk = strtok(str, delim); while (tk != NULL && cnt < MAXITEM) { outlist[cnt++] = tk; tk = strtok(NULL, delim); } return cnt; } int main(void) { FILE *fp; char *fname = "testfile.csv"; char *tp; char *array[1400]; char *test[11][1400]; char c; int i = 0; int n,y; char *tp[1400]; fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } while ((c = fgetc(fp)) != EOF) { array[i] = (char)c; i++; } tp = strtok(array, ","); puts(*tp); while (tp != NULL) { tp = strtok(NULL, ","); if (tp != NULL)puts(tp); } for (n = 0; n < 11; n++) { for (y = 0; y < 1400; y++) { test[n][y] = tp[y]; printf("%c", test[n][y]); } } fclose(fp); return 0; }

  • 何故オーバーフロー??

    http://oshiete1.goo.ne.jp/qa4423673.html さらに続きになります。 #include<stdio.h> #include<string.h> #define NAME 256 // 暫定的に最大値を決めてます int Convert(const char* pInFileName, const char* pOutFileName); int ReConvert(const char* pInFileName, const char* pOutFileName); int main(){ int a,ret=-1; char InFileName[NAME]; // 入力ファイル名 char OutFileName[NAME]; // 出力ファイル名 FILE *pInFileName; // 入力ファイルポインタ FILE *pOutFileName; // 出力ファイルポインタ printf("1:コンバート 2:リコンバート\n"); scanf("%d",&a); /***** 入力ファイル名入力 *****/ printf("\n@@@@@入力ファイル名入力\n"); scanf("%s",&InFileName); // 入力ファイルオープン if((pInFileName=fopen(InFileName,"rb"))==NULL){ printf("ファイルがありません\n"); return -1; } /***** 出力ファイル名入力 *****/ printf("\n@@@@@暗号化後ファイル名入力\n"); scanf("%s",&OutFileName); // 出力ファイルオープン if((pOutFileName=fopen(OutFileName,"r"))!=NULL){ // read出来るのなら既にファイルあるという事なのでエラーにする printf("同名のファイルが既にあります\n"); return -1; } pOutFileName=fopen(OutFileName,"wb"); // 1:コンバート // 2:リコンバート // 1,2以外:終了 if(a==1){ ret=Convert((const char*)pInFileName,(const char*)pOutFileName); } else if(a==2){ ret=ReConvert((const char*)pInFileName,(const char*)pOutFileName); } if(ret==0){ printf("正常終了\n"); } else{ printf("異常終了\n"); return -1; } printf("数字+エンターで終了します\n"); scanf("%d",&a); fclose(pOutFileName); fclose(pInFileName); return 0; } /*****コンバート*****/ int Convert(const char* pInFileName, const char* pOutFileName) { unsigned char moji; while(1) { if(fread( &moji, 1, 1, (FILE*)pInFileName )>0){ fprintf((FILE*)pOutFileName,"%02x",moji); } else break; } return 0; } /*****リコンバート*****/ int ReConvert(const char* pInFileName, const char* pOutFileName) { char moji16[3]; // 16進表記 char moji10[4];★★★★★★★★★★ long i,j; while(1) { if(fread( moji16, 1, 2, (FILE*)pInFileName )>0){ for(i=0,j=0;i<2;i+=2,j++){ sscanf(&moji16[i], "%2x", moji10); } fprintf((FILE*)pOutFileName,"%c",moji10); } else break; } return 0; } 上記の char moji10[4];★★★★★★★★★★ の部分ですが、これを配列を用いずに、moji10とした場合(応じてsscanfでは&moji10になる)や moji10[2]、moji10[3]とした場合でもオーバーフローが検出されました。 sscanfの行になった時に、moji10[0]には文字が入りますが、 moji10[1]~moji10[3]まで、NULL文字'\0'が入っていました。 何故moji10[4]にしないとオーバーフローが消えないのでしょうか? 尚、Visual C++ 2008です。

  • C言語で.pgmの画像を作り、見る

    Windows10のコマンドプロンプト上でC言語を使って.pgmの画像を作り、見ることができないので質問します。 以下のソースコードを実行してつくった。out.pgmファイルをGIMPとirfanviewというソフトを使ってみようとしましたが、GIMPはPNM 画像 エラーメッセージ 不正なファイルですと返し、irfanviewは invalid or unsupported PNMファイルと返し、何も表示されませんでした。 #include<stdio.h> int main(void){ FILE *fp; fp=fopen("out.pgm","wb"); fprintf(fp,"P5\n"); fprintf(fp,"#Image\n"); fprintf(fp,"256 256\n"); fprintf(fp,"255\n"); for(int i=0;i<256;i++){ for(int j=0;j<256;j++){ fwrite(&j,sizeof(unsigned char),1,fp); } } fclose(fp); return(0); } どなたかC言語で.pgmの画像を作り、見る方法を教えてくださいお願いします。

  • C言語 配列

    配列から配列への要素の引き渡し方をやろうと for ( i = 0; i < 4; i++ ) for ( j = 0; j < 5; j++ ) {{ w1[i][j] = In1[i][j]; w2[i][j] = In4[i][j]; }} とやってみました。エラーは出ないのですがうまく動きません。 どなたかアドバイスお願いします

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

専門家に質問してみよう