PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Finde Fehler im C++-Prog nicht


Gast
2005-06-27, 16:21:33
Hallo!

Ist ein Berechnungsprog für Maschinenbau.
Eingegeben sind
Fr=1
axial=1
Fr=1
d=25
n=3000
L=20000

Aber: Stürzt ab und debug ergibt für optLager=-8xxxxxxxxx als Wert. Wie kann das sein?

Bin für jede Hilfe dankbar! ;(




// Lagersoftware.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cmath>
#include <vector>
#include <conio.h>
#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <boost/lexical_cast.hpp>

using namespace std;

class Lagerdaten {

protected:

vector <float> e, dynC, statC, y, y0;
string Datei;

public:

vector <int> d;
vector <int> D;
vector <string> typ;

Lagerdaten(string LagerDatei) { Datei=LagerDatei; }

void Einlesen();

};

void Lagerdaten::Einlesen() {


ifstream Lagerliste(Datei.c_str());
Lagerliste.seekg(ios::beg);
std::string tmp;
while (!Lagerliste.eof() && !Lagerliste.fail() ) {
getline(Lagerliste,tmp,'\t');
d.push_back(boost::lexical_cast<int>(tmp));
getline(Lagerliste,tmp,'\t');
D.push_back(boost::lexical_cast<int>(tmp));
getline(Lagerliste,tmp,'\t');
dynC.push_back(boost::lexical_cast<float>(tmp));
getline(Lagerliste,tmp,'\t');
e.push_back(boost::lexical_cast<float>(tmp));
getline(Lagerliste,tmp,'\t');
y.push_back(boost::lexical_cast<float>(tmp));
getline(Lagerliste,tmp,'\t');
statC.push_back(boost::lexical_cast<float>(tmp));
getline(Lagerliste,tmp,'\t');
y0.push_back(boost::lexical_cast<float>(tmp));
getline(Lagerliste,tmp);
typ.push_back(tmp);
}

}

class dynBeanspruchung : public Lagerdaten {

double Fr, Fa;
int L, n, axial;

double p(int z);

public:

dynBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { FR=Fr; FA=Fa; LL=L; N=n; AXIAL=axial; }

int SucheLagerDyn(int y);

};

double dynBeanspruchung:P(int z) {

double p;

if ((Fa/Fr)<=e[z]) {
if (axial==1) p=Fr;
else p=Fr+1.12*y[z]*Fa;
}
else {
if (axial==1) p=0,4*Fr+y[z]*Fa;
else p=0.67*Fr+1.68*y[z]*Fa;
}

return p;

}

int dynBeanspruchung::SucheLagerDyn(int y) {

Einlesen();
double CTRAG;
int IndexOpt=1;

CTRAG=pow((L*n*60/1000000),(3/10))*p(y);

if (axial==2)
CTRAG=CTRAG/1.715;

if (dynC[y]<=CTRAG)
IndexOpt=y;

return IndexOpt;

}

class statBeanspruchung : public Lagerdaten {

double Fr, Fa;
int L, n, axial;

double p(int z);

public:

statBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { FR=Fr; FA=Fa; LL=L; N=n; AXIAL=axial; }

int SucheLagerStat(int y);

};

double statBeanspruchung:P(int z) {

double p;

if ((Fa/Fr)<=(1/(2*y0[z]))) {
if (axial==1) p=Fr;
else p=0.5*Fr+y0[z]*Fa;
}
else {
p=Fr+2*y0[z]*Fa;
}

return p;

}

int statBeanspruchung::SucheLagerStat(int y) {

Einlesen();
double CTRAG;
int IndexOpt=1;

CTRAG=pow((L*n*60/1000000),(3/10))*p(y);

if (axial==2)
CTRAG=CTRAG/1.715;

if (statC[y]<=CTRAG)
IndexOpt=y;

return IndexOpt;

}

int main() {

double Fa, Fr;
int axial, L, durchmesser, n, optLager;
string LagerDatei = "lager.txt";

cout << "Lagerbestimmungsprogramm am Bsp. FAG Kegelrollenlager\n\n" << endl;
cout << "Geben Sie die konstruktiven Merkmale an:" << endl;
cout << "\n\nAxialkraft in kN: ";
cin >> Fa;
Fa=fabs(Fa);
cout << "\n(1)einseitige oder (2)zweiseitige axiale Belastung?: ";
do
cin >> axial;
while(!axial==1 || !axial==2);
cout << "\nRadialkraft in kN: ";
cin >> Fr;
Fr=fabs(Fr);
cout << "\nWellendurchmesser: ";
cin >> durchmesser;
cout << "\nDrehzahl in min^-1: ";
cin >> n;
cout << "\nGewünschte Lebensdauer: ";
cin >> L;

if(n<=10) {

class statBeanspruchung statBea(Fr, Fa, L, n, axial, LagerDatei);

for(int x=1; x<=statBea.d.size(); x++) {
if(statBea.d[x]==durchmesser)
optLager = statBea.SucheLagerStat(x);
}

cout << "\n\nDas entsprechende Lager entspricht FAG" << statBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << statBea.D[optLager] << endl;

}

else {

class dynBeanspruchung dynBea(Fr, Fa, L, n, axial, LagerDatei);

for(int x=1; x<=dynBea.d.size(); x++) {
if(dynBea.d[x]==durchmesser)
optLager = dynBea.SucheLagerDyn(x);
}

cout << "\n\nDas entsprechende Lager entspricht FAG" << dynBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << dynBea.D[optLager] << endl;

}

getch();
return 0;

}



Und die Lager.txt:

15 35 15 0,35 1,73 14,3 0,95 30202A
15 42 23,2 0,29 2,11 20,8 1,16 30302A
17 40 19,3 0,35 1,74 19 0,96 30203A
17 40 29 0,31 1,92 30 1,06 32203A
17 47 28 0,29 2,11 25 1,16 30303A
17 47 36,5 0,29 2,11 36,5 1,16 32303A
20 42 24 0,37 1,6 29 0,88 32004X
20 47 27,5 0,35 1,74 27,5 0,96 30204A
20 52 34,5 0,3 2 33,5 1,1 30304A
20 52 31 0,73 0,82 30,5 0,45 31304
20 52 46,5 0,3 2 48 1,1 32304A
25 47 26,5 0,43 1,39 34 0,77 32005X
25 52 32,5 0,37 1,6 35,5 0,88 30205A
25 52 40,5 0,36 1,67 45 0,92 32205A
25 52 49 0,35 1,71 58,5 0,94 33205
25 62 47,5 0,3 2 46,5 1,1 30305A
25 62 38 0,83 0,73 39 0,4 31305A
25 62 63 0,3 2 65,5 1,1 32305A
28 52 34 0,43 1,39 40,5 0,77 320/28X

zeckensack
2005-06-27, 16:36:19
1)LagerDaten::Einlesen wird nirgends aufgerufen. Sollte wohl in den Konstruktor von LagerDaten (dann private machen). Fehlerbehandlung bei nicht vorhandener Datei wäre dann noch 'ne angebrachte Maßnahme.

2)int optLager;
//...
for(int x=1; x<=statBea.d.size(); x++) {
if(statBea.d[x]==durchmesser)
optLager = statBea.SucheLagerStat(x);
}Vom Teufel!
optLager sollte auf jeden Fall initialisiert werden, damit es auch dann einen Wert hat, wenn in statBea.d keine Entsprechung gefunden wird. Dieser sollte dann gesondert behandelt werden (wieder Stichwort Fehlerbehandlung).
Das erklärt auch dein Problem mit der interessanten negativen Zahl.

edit: und ich schließe mich natürlich auch ScottManDeaths Korrekturen bzgl Array-Indizes an.

ScottManDeath
2005-06-27, 16:49:05
int optLager;
//...
for(int x=1; x<=statBea.d.size(); x++) {
if(statBea.d[x]==durchmesser)
optLager = statBea.SucheLagerStat(x);
}

vector<int> ist 0 basiert. So wie es dort steht liest Du das erste Element (mit dem Index 0) nicht und liest aber ein Element hinter dem letzten gültigen Element ( statBea.d.size()-1)

Besser so:


int optLager;
//...
for(int x = 0; x < statBea.d.size(); x++) {
if(statBea.d[x]==durchmesser)
optLager = statBea.SucheLagerStat(x);
}

ScottManDeath
2005-06-27, 16:52:04
Am besten noch um die while Schleife mit den boost::lexical_cast noch einen try .. catch block um Fehler abzufangen



try
{

... die lexical_casts
}
catch (boost::bad_lexical_cast& e)
{
cout << "fehler in der eingabe "<< e.what();
}