Q&A
###前提・実現したいこと
x,yの2つの座標を持つ点をxの値で並べ替えた後に、xの値がMAXとMINの間を10等分した範囲にあるものでそれぞれファイルを生成したい。
データの例
1.1200000000000045 159.72083333333333 -2.7933333333333508 29.30048888888889 10.689999999999998 110.30972222222222 -5.396666666666647 47.88305555555556 -3.9833333333333485 16.589733333333335 21.29666666666668 103.66012222222223 -5.133333333333383 18.155822222222223 -4.853333333333353 21.393155555555555 1.160000000000025 44.233155555555555 12.49666666666667 31.538622222222223
これが16000行あります
###発生している問題・エラーメッセージ
並べ変えた後のすべてのデータ(fsd0_0.dat)を出力することはできていますので、おそらく
sprintf(filename, "fsd0_%d.dat", i);
以下が間違っているのだと思います。
*** glibc detected *** ./fs.exe: double free or corruption (top): 0x0000000000c8fa40 *** ======= Backtrace: ========= [0x4096da] [0x40c4ac] [0x401e8d] [0x400700] [0x40095b] [0x4003a9] ======= Memory map: ======== 00400000-004a7000 r-xp 00000000 fd:02 17700682 /home/t12301027/test/fs.exe 006a6000-006a8000 rw-p 000a6000 fd:02 17700682 /home/t12301027/test/fs.exe 006a8000-006e9000 rw-p 00000000 00:00 0 00c8e000-00cb0000 rw-p 00000000 00:00 0 [heap] 7f7c6c000000-7f7c6c023000 rw-p 00000000 00:00 0 7f7c6c023000-7f7c70000000 ---p 00000000 00:00 0 7f7c72c42000-7f7c72c44000 rw-p 00000000 00:00 0 7ffdefbc8000-7ffdefbdd000 rw-p 00000000 00:00 0 [stack] 7ffdefbf8000-7ffdefbf9000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] アボートしました (コアダンプ)
###該当のソースコード
C++
1#include <stdio.h> 2#include <stdlib.h> 3 4#define SN 16000 5#define MAX 40 6#define MIN -40 7#define SPN 10 //MAX-MINはSPNで割り切れる 8 9FILE *fr0; 10char *read_file="t01d0.dat"; 11 12FILE *fw0,*fw[SPN+1]; 13char *write_file0 = "fsd0_0.dat"; 14char filename[100]; 15 16int total = SN; 17int i, j, k, rmin, rmax; 18float xf, yf, x[SN+1], y[SN+1], rx[SN+1], ry[SN+1]; 19 20void main(){ 21 22if(NULL==(fr0=fopen(read_file,"r"))){ 23printf("filenashi"); 24exit(EXIT_FAILURE); 25} 26 27for (i = 1; i<=SN-1; i++) { 28 29 fscanf(fr0, "%f %f", &xf, &yf); 30 x[i] = xf; 31 y[i] = yf; 32} 33for(i = 1; i<=SN-1; i++){ 34 for(j=i+1;j<=SN;j++){ 35 rx[i] = x[i]; 36 ry[i] = y[i]; 37 if(x[i] >= x[j]){ 38 rx[i] = x[j]; 39 ry[i] = y[j]; 40 x[j] = x[i]; 41 y[j] = y[i]; 42 x[i] = rx[i]; 43 y[i] = ry[i]; 44 } 45 } 46} 47rx[SN] = x[SN]; 48ry[SN] = y[SN]; 49 50fw0 = fopen(write_file0,"a"); 51for(i=1;i<=SN;i++){ 52 fprintf(fw0,"%f %f\n",rx[i],ry[i]); 53} 54fclose(fw0); 55for(i=1; i<=SPN; i++){ 56 sprintf(filename, "fsd0_%d.dat", i); 57 fw[i]=fopen(filename, "a"); 58 rmin = MIN + ((MAX - MIN) / SPN*(i - 1)); 59 rmax = MIN + ((MAX - MIN) / SPN*i); 60 for (k = 1; k <= SN; k++) { 61 if (rmin < rx[k] && rx[k] <= rmax) { 62 fprintf(fw[i], "%f %f\n", rx[k], ry[k]); 63 } 64 fclose(fw[i]); 65 } 66 67} 68fclose(fr0); 69}
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2017/01/24 04:36
2017/01/24 05:29 編集