rtsx
24-10-2005, 10:36
Hallo,
ich habe ein Problem wenn ich ein Array mit 604800 Einträgen deklarieren möchte. Die obere Version des Codes funktioniert die untere nicht:
Funktioniert: dialog3.h
#define MAXDAUER 604800 private:
double x [MAXDAUER]; // x Messdaten (Zeit)
double y [MAXDAUER]; // y Messdaten (Temp)
long int z; // Position im Messdatenarray
dialog3.cpp void Dialog3::analyse() {
z=0;
do{
rueckgabe = modul->lese(&line[0],&anzahl,&distanz,&zeit,&temp,&pos);
switch(rueckgabe)
{
case 4: // Daten auslesen
lineEdit_status->setText("Messdaten werden ausgelesen.");
x[z]=(double)zeit;
y[z]=temp;
z++;
break;
case 5: // Ende Datensatz, zeichne Kurve
wtPlot->removeCurves();
curve1 = wtPlot->insertCurve("Messkurve");
wtPlot->setCurveData(curve1, x, y, z);
wtPlot->replot();
break;
}// end switch
}((rueckgabe != 1) && (rueckgabe != 5) );
}//end analyse
Funktioniert NICHT: dialog3.h
#define MAXDAUER 604800 -> keine weiteren Werte deklariert
dialog3.cpp void Dialog3::analyse() {
long int z=0;
double x [MAXDAUER]; // x Messdaten (Zeit)
double y [MAXDAUER]; // y Messdaten (Temp)
do{
rueckgabe = modul->lese(&line[0],&anzahl,&distanz,&zeit,&temp,&pos);
switch(rueckgabe)
{
case 4: // Daten auslesen
lineEdit_status->setText("Messdaten werden ausgelesen.");
x[z]=(double)zeit;
y[z]=temp;
z++;
break;
case 5: // Ende Datensatz, zeichne Kurve
wtPlot->removeCurves();
curve1 = wtPlot->insertCurve("Messkurve");
wtPlot->setCurveData(curve1, x, y, z);
wtPlot->replot();
break;
}// end switch
}((rueckgabe != 1) && (rueckgabe != 5) );
}//end analyse
Bei Zugriff auf diese Funktion entsteht ein Speicherzugriffsfehler
Selbst wenn man die case 4 und 5 bis auf das break leert, erscheint der Speicherzugriffsfehler, obwohl die beiden arrays lediglich deklariert werden.
Wenn man MAXDAUER jedoch auf zb 60000 definiert funktioniert auch diese Version.
Desweiteren funktioniert es wenn man das array mit new anlegt und danach wieder mit delete löscht
(Versuche haben auch gezeigt, dass nach der Methode nie wieder auf das Array zugegriffen wird)
--------------------------------------------------------------------------------------
Vermutung:
Einer Methode wird weniger Speicherraum als einer Headerdatei zum deklarieren zur Verfügung gestellt.
Kann mir das irgend jemand bestätigen oder widerlegen, ich würde schon gerne verstehen warum hier ein Fehler entsteht (workarounds habe ich ja...)
schonmal danke
Tobias
ich habe ein Problem wenn ich ein Array mit 604800 Einträgen deklarieren möchte. Die obere Version des Codes funktioniert die untere nicht:
Funktioniert: dialog3.h
#define MAXDAUER 604800 private:
double x [MAXDAUER]; // x Messdaten (Zeit)
double y [MAXDAUER]; // y Messdaten (Temp)
long int z; // Position im Messdatenarray
dialog3.cpp void Dialog3::analyse() {
z=0;
do{
rueckgabe = modul->lese(&line[0],&anzahl,&distanz,&zeit,&temp,&pos);
switch(rueckgabe)
{
case 4: // Daten auslesen
lineEdit_status->setText("Messdaten werden ausgelesen.");
x[z]=(double)zeit;
y[z]=temp;
z++;
break;
case 5: // Ende Datensatz, zeichne Kurve
wtPlot->removeCurves();
curve1 = wtPlot->insertCurve("Messkurve");
wtPlot->setCurveData(curve1, x, y, z);
wtPlot->replot();
break;
}// end switch
}((rueckgabe != 1) && (rueckgabe != 5) );
}//end analyse
Funktioniert NICHT: dialog3.h
#define MAXDAUER 604800 -> keine weiteren Werte deklariert
dialog3.cpp void Dialog3::analyse() {
long int z=0;
double x [MAXDAUER]; // x Messdaten (Zeit)
double y [MAXDAUER]; // y Messdaten (Temp)
do{
rueckgabe = modul->lese(&line[0],&anzahl,&distanz,&zeit,&temp,&pos);
switch(rueckgabe)
{
case 4: // Daten auslesen
lineEdit_status->setText("Messdaten werden ausgelesen.");
x[z]=(double)zeit;
y[z]=temp;
z++;
break;
case 5: // Ende Datensatz, zeichne Kurve
wtPlot->removeCurves();
curve1 = wtPlot->insertCurve("Messkurve");
wtPlot->setCurveData(curve1, x, y, z);
wtPlot->replot();
break;
}// end switch
}((rueckgabe != 1) && (rueckgabe != 5) );
}//end analyse
Bei Zugriff auf diese Funktion entsteht ein Speicherzugriffsfehler
Selbst wenn man die case 4 und 5 bis auf das break leert, erscheint der Speicherzugriffsfehler, obwohl die beiden arrays lediglich deklariert werden.
Wenn man MAXDAUER jedoch auf zb 60000 definiert funktioniert auch diese Version.
Desweiteren funktioniert es wenn man das array mit new anlegt und danach wieder mit delete löscht
(Versuche haben auch gezeigt, dass nach der Methode nie wieder auf das Array zugegriffen wird)
--------------------------------------------------------------------------------------
Vermutung:
Einer Methode wird weniger Speicherraum als einer Headerdatei zum deklarieren zur Verfügung gestellt.
Kann mir das irgend jemand bestätigen oder widerlegen, ich würde schon gerne verstehen warum hier ein Fehler entsteht (workarounds habe ich ja...)
schonmal danke
Tobias