0

このコードを機能させようとしていますが、すぐにセグメンテーション違反が発生し、その理由がわかりません。Fstream はファイルを開くことができますが、これら 3 つの while ループが問題を引き起こしています。コメントしても、プログラムは segfault をスローしません。もちろん、配列の容量はファイルよりも大きくなります。cout << inputf を使用すると 0x7fff617291a0 のような表示になりますが、ファイルは問題ないようで、少し当惑しています。

#include <iostream>
#include <fstream>
#include <cmath>
#include <string>


using namespace std;

int main(){

string plikf = "BH_diagnostics.ah1.pg";
string pliks = "BH_diagnostics.ah2.pg";
string plikt = "BH_diagnostics.ah3.pg";
ifstream inputf("BH1"); ifstream inputs("BH2"); ifstream inputt("BH3");
ofstream output("script.p");;

output << "plot " << '"' << plikf << '"' << "using 1:2, " << '"' << pliks << '"' << "using 1:2, " << '"' << plikt << '"' << "using 1:2 w l \n";
double trash;

if(!inputf) cout << "panick 1 ";
if(!inputs) cout << "panick 2 ";
if(!inputt) cout << "panick 3" ;

double bhf[3000][5];
double bhs[3000][5];
double bht[3000][5];
int i,j,k;
// PROBLEM HERE
while (inputf >> trash >> bhf[i][0] >> bhf[i][1] >> bhf[i][2] >> bhf[i][3] >> trash >> trash >> bhf[i][4] >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash){i++;cout << bhf[i][0];} 
while (inputs >> trash >> bhs[j][0] >> bhs[j][1] >> bhs[j][2] >> bhs[j][3] >> trash >> trash >> bhs[j][4] >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash){ j++; cout << bhs[j][0];}
while ( inputt >> trash >> bht[k][0] >> bht[k][1] >> bht[k][2] >> bht[k][3] >> trash >> trash >> bht[k][4] >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash  >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash ){ k++; cout << bht[k][0];}


int l,n;
double dt = bht[k][0]/20;
for (int s=0; s<i; s++) {
if (bhf[s][0] > l) { output << "\n set object " << n << " circle at axis " << bhf[s][1] << ',' << bhf[s][2] << " size first " << bhf[s][4] <<  " fc rgb " << '"' << "navy" << '"' << "\n"; l+=dt; n++;}
}

l=bhs[1][0];

for (int s=0; s<j; s++) {
if (bhs[s][0] > l) { output << "\n set object " << n << " circle at axis " << bhs[s][1] << ',' << bhs[s][2] << " size first " << bhs[s][4] <<  " fc rgb " << '"' << "navy" << '"' << "\n"; l+=dt; n++;}
}

l=bht[1][0];

for (int s=0; s<k; s++) {
if (bht[s][0] > l) { output << "\n set object " << n << " circle at axis " << bht[s][1] << ',' << bht[s][2] << " size first " << bht[s][4] <<  " fc rgb " << '"' << "navy" << '"' << "\n"; l+=dt; n++;}
}

return 0;

}
4

2 に答える 2

1

私の推測では、ループ変数 (i、j、k) は初期化されておらず、ランダムな値が含まれています。これらの値で配列にアクセスすると、segfault が発生します。

int i = 0; 
int j = 0; 
int k = 0;

これで問題は解決するはずです。

于 2012-12-05T10:21:53.060 に答える
0
int i,j,k;

0 または何らかの開始条件に初期化する必要があります。このようにランダムな値が含まれるため、配列にアクセスするループで境界の問題が発生する可能性があります。

int i=0,j=0,k=0;
于 2012-12-05T10:22:01.193 に答える