PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sind Arrays in Methoden begrenzt?



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

quinte17
24-10-2005, 11:14
was zur hölle ist bei dir die variable rückgabe? ;)
ist die global definiert oder in deiner klasse, aber nicht in dem beispiel?

greetz

rtsx
24-10-2005, 11:45
Über rueckgabe erkennt mein Programm was es gerade eingelesen hat.

Ich lese daten aus einer Datei ein und erhalte eine 4 zurück wenn es Temperaturdaten waren bzw eine 5 wenn die Messreihe zu ende ist.

die Variable ist in der header als normaler int Wert deklariert.

anda_skoa
24-10-2005, 12:22
Der Platz am Stack ist begrenzt, aber du kannst jederzeit die Arrays am Heap anlegen:



#define MAXDAUER 604800 -> keine weiteren Werte deklariert

dialog3.cpp void Dialog3::analyse() {
long int z=0;
double* x = new double[MAXDAUER]; // x Messdaten (Zeit)
double* y = new double[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) );

delete[] x;
delete[] y;
}//end analyse

rtsx
24-10-2005, 12:40
ah also hatte ich mit meiner Vermutung recht, dankeschön ;)

das mit dem Heap hatte ich ja schon ausprobiert, das klappt ja.
Kann man irgendwo auch nachlesen wie genau diese Begrenzungen aussehen?

gruß
Tobias

pyrorl
24-10-2005, 15:34
man 2 setrlimit
man 2 sigaltstack