2016-11-12 5 views
-2

기본적으로 간단한 수학 프로그램 인 프로그램에 문제가 있습니다. 몇 가지 벡터 곱셈과 벡터 행렬 곱셈을 수행하고 텍스트에서 데이터를 읽으 려 할 때까지 제대로 작동합니다. 프로그램을 컴파일 할 수는 있지만 실행하려고하면 "Dataname.exe가 작동하지 않습니다"라는 오류가 발생합니다. 여기 내 코드가 있습니다. 수족을 고려하지 마십시오ifstream 사용 방법

#include<iostream> 
#include<cmath> 
#include<vector> 
#include"header.hpp" 
#include<fstream> 
using namespace std; 

int main() 
{ 
    ifstream einlesen ("Zahlen.dat"); //function "einlesen" opens the file "Zahlen.dat". 
    if (einlesen) // Message if the file has been opend 
    cout<<"Daten wurden eingelesen"<<endl; 
    else { 
    cout<<"Konnte Daten nicht einlesen"<<endl; 
    return 99; 
    } 

    double a; 
    int n{0}; 

    while (einlesen >>a>>a>>a>>a>>a>>a>>a) n++;//Loop copys datas on a 

    einlesen.clear();//stops the loop after the last data is copied. 
    einlesen.seekg(0, ios_base::beg);//?? 

    vector<double> vecein(n), vecein1(n),Matrixein(n); 
    for (a = 0;a<n;a++);//copys datas to a vector further calculations 
    { 
    einlesen>>vecein.at(a); 
    einlesen>>vecein1.at(a); 
    einlesen>>Matrixein.at(a); 
    } 

    double Matrix1[9]; //defining my Matrix and the coordinates of my vectors. 
    double x,y,z,x_1,x_2,x_3; 
    vector<double> vec(3); 
    vector<double> vec1(3); 

    // Old code where I read the data with `cin`: 
    /*cout<<"Geben Sie die x Koordinaten ein:"<<endl; 
    cin>>vec[0]; 
    cin>>vec1[0]; 

    cout<<"Geben Sie die y Koordinaten ein:"<<endl; 
    cin>>vec[1]; 
    cin>>vec1[1]; 

    cout<<"Geben Sie die z Koordinaten ein:"<<endl; 
    cin>>vec[2]; 
    cin>>vec1[2]; 

    cout<<"Geben Sie eine Matrix ein"<<endl; 
    cin>>Matrix1[0]>>Matrix1[1]>>Matrix1[2]>>Matrix1[3]>>Matrix1[4]>>Matrix1[5]>>Matrix1[6]>>Matrix1[7]>>Matrix1[8]; 

    cout<<"Vektor1:<"<<vec[0]<<","<<vec[1]<<","<<vec[2]<<">"<<endl; 
    cout<<"Vektor2:<"<<vec1[0]<<","<<vec1[1]<<","<<vec1[2]<<">"<<endl; 

    vector<double> Addition(3); 
    Addition = Vektoraddition(vec,vec1); 
    cout<<"Addition:"<<"<"<<Addition[0]<<","<<Addition[1]<<","<<Addition[2]<<">"<<endl; 

    double Skalarprodukt; 
    Skalarprodukt = Skalarpr(vec,vec1); 

    cout<<"Skalarprodukt:"<<Skalarprodukt<<endl; 
    vector<double> kreuzprodukt(3); 
    kreuzprodukt = Kreuzprodukt (vec,vec1); 
    cout<<"Kreuzprodukt:"<<"<"<<kreuzprodukt[0]<<","<<kreuzprodukt[1]<<","<<kreuzprodukt[2]<<">"<<endl; 

    vector<double> MatrixVektor(3); 
    MatrixVektor = Matrix_vektor (Matrix1, vec); 
    cout<<"Matrix*Vektor:"<<"<"<<MatrixVektor[0]<<","<<MatrixVektor[1]<<","<<MatrixVektor[2]<<">"<<endl;*/ 

    ofstream ausgabe ("Ausgabe.dat");//write the data on Ausgabe.dat 
    for (int i = 0; i < a; i++) 
    { 
    ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]<<")" << endl; 
    } 
    return 0; 
} 

나는 변수 이름에 대해 궁금하지 않습니다. 내 문제는 내가 while 루프에서 무엇을하는지 이해하지 못한다는 것이다. Zahlen.dat는 1 2 3 4 5 6 7과 유사한 파일이며 Ausgabe.dat는 빈 파일입니다. 사실 Ausgabe.dat에 내용이 변경되었다고 알려주기 때문에 쓰기는하지만 파일을 새로 고침하면 여전히 비어 있습니다.

+1

들여 쓰기를 시도하고 코드를 더 읽기 쉽게 포맷 해 주실 수 있습니까? 소스 코드에 표시되는 것과 동일한 언어로 오류 메시지를보고하면 오류를 던지고있는 행을 알 수 있습니다. – Davislor

+0

입력 파일이 열리지 않고 그 이유를 알 수없는 경우 한 가지 방법은 프로그램 상단에'#include '과'#include '을 쓰고 오류 메시지는'cerr << __FILE__ << ':'<< __LINE__ << "": "<< strerror (errno) << endl; 대부분의 프로그램에는 비슷한 것을하는 매크로가 있습니다. – Davislor

답변

0

첫 번째 코드 샘플에는 다르게 수행해야하는 몇 가지 사항이 있습니다. 프로그램은 먼저 파일을 열고 변수 n에있는 파일의 7 개 숫자 블록 수를 계산합니다. 그런 다음 파일 포인터가 재설정되고 세 개의 벡터가 n 크기로 생성되고 첫 번째 n 숫자가 파일에서 벡터로 읽혀집니다. 하지만 : 벡터의 항목 수를 미리 알 필요가 없으므로 파일을 두 번 읽을 필요가 없습니다. 숫자를 추가하려면 vector::push_back을 사용하십시오.

두 번째 문제 : 숫자를 읽는 루프에서 a이 루프 변수로 사용됩니다 (double). 두 배 증가하면 일회성 오류가 발생하여 충돌을 설명 할 수 있습니다.

논리가 맞는지 확실하지 않습니다. 파일에 여러 개의 숫자가있는 숫자 (n)가 각각 7 개 있지만 숫자가 첫 번째로 n 인 것으로 생각됩니다. 당신이 10 개의 라인을 가지고 있다고 가정하면, 첫 번째 라인과 세 번째 라인의 번호를 벡터로 읽어 들일 수 있습니다. 또한 모든 라인 번호 또는 각 라인의 첫 번째 라인 (또는 심지어는 3D 구조)을 읽을 수도 있습니다.

cin에서 읽은 두 번째 코드 샘플은 어떻게됩니까? 저거 작동 했니? 당신이하려고하는 것을 설명했다면 도움이 될 것입니다. 파일에 벡터가 있고, 벡터 제품 (Kreuzprodukt)을 가져 가고 싶습니다. 파일의 레이아웃은 줄이나 열로 작성 되었습니까?

편집 :

for (a = 0;a<n;a++); 
{ 
    einlesen>>vecein.at(a); 
    ... 

공지 루프 후 ; : 충돌의 원인이 선 것 같다. 이렇게하면 어떤 명령문도없이 루프가 먼저 실행되고 괄호 안의 부분은 루프 조건이 더 이상 충족되지 않을 때 실행됩니다. 즉 a은 이미 n과 같습니다.

0

귀하의 조언을 시도했지만 여전히 작동하지 않습니다. 나는 그것이 작동 하는지를보고 싶었 기 때문에 나는 나의 데이터를 읽는 방식을 바꾸지 않았다. 여기에 내 오류 메시지가 있습니다 : 'std :: out_of_range'인스턴스를 throw 한 후 호출이 종료되었습니다. what() : vector :: _ M_range_check : __n (10 임)> = this-> size() (10)

이 응용 프로그램은 비정상적인 방식으로 종료하도록 런타임을 요청했습니다. 자세한 내용은 응용 프로그램 지원 팀에 문의하십시오.

내 코드는 지금이 바로 다음과 같습니다

int main() 

{ 



ifstream einlesen ("Zahlen.dat"); 

if (einlesen) 



cout<<"Daten wurden eingelesen"<<endl; 



else 

{ 

cout<<"Konnte Daten nicht einlesen"<<endl; 

return 99; 

} 



double a; 

int n{0}; 

while (einlesen >>a>>a>>a>>a>>a>>a>>a) n++; 

{ 
einlesen.clear(); 

einlesen.seekg(0, ios_base::beg); 

vector<double> vecein(n), vecein1(n),Matrixein(n); 

int b;// new variable of type int. 
for (b = 0;b<n;b++); 

{ 

einlesen>>vecein.at(b); 

einlesen>>vecein1.at(b); 

einlesen>>Matrixein.at(b); 

} 

ofstream ausgabe ("Ausgabe.dat"); 

for (int i = 0; i < b; i++) 

{ 

    ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]  <<")" << endl; 

} 
} 
return 0; 

그래서 나는 기본적으로 단지 루프의 변수를 변경했습니다. 예. cin을 사용하여 데이터를 가져 왔을 때 programm이 작동했습니다. 나는 왜 프로그래머가 작동하지 않는지 전혀 모른다!

+0

그냥 보았습니다 :이 버전과 원래 버전 모두'for' 문 뒤에'; '이 있기 때문에'for' 문 다음의 블록은 루프의 반복마다 실행되지 않습니다. 나중에. 이 시점에서 루프 변수는 이미 'n'과 같으므로 벡터 액세스가 범위를 벗어나므로 충돌이 발생합니다 (루프가 의도 한대로 작동하지 않음). BTW, 이러한 오류를 찾는 좋은 방법은 디버거입니다. 하나를 사용하여 각 행을 단계별로 실행하여 이러한 오류를 쉽게 찾으십시오. –

+0

정말 고마워요! 마침내 효과가 있습니다! 다음 단계는이 수를 벡터로 정의하는 것이지만, 먼저이 수를 시도 할 것입니다. 고맙습니다! – gamma