Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Sind Arrays in Methoden begrenzt?

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.09.2005
    Beiträge
    23

    Sind Arrays in Methoden begrenzt?

    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:

    PHP-Code:
    Funktioniert:  dialog3.
    #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(curve1xyz);     
                
    wtPlot->replot();     
                break;     
            }
    // end switch     
        
    }((rueckgabe != 1) && (rueckgabe != 5) ); 
    }
    //end analyse 
    PHP-Code:
    Funktioniert NICHT:  dialog3.
    #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(curve1xyz);     
                
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.09.2005
    Beiträge
    23
    Ü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.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Der Platz am Stack ist begrenzt, aber du kannst jederzeit die Arrays am Heap anlegen:

    Code:
    #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
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    15.09.2005
    Beiträge
    23
    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

  6. #6
    pyrorl
    Gast
    man 2 setrlimit
    man 2 sigaltstack

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •