Obergrenze Array [DIM]?



  • oha,, sowas hatte ich vermutet. das ist ja ärgerlich.

    weiss evtl jmd wie man in C den Stackspeicher vergrößert?

    danke und gruß



  • Schlag dir das aus dem Kopf und mache es gleich richtig, andere Leute haben auch schon diese Probleme gehabt:

    http://www.c-plusplus.net/forum/p2051883#2051883



  • wenn es keine andere Möglichlichkeit gibt, mache ich das anders,, auch wenn es sehr ärgerlich ist,, hab viel Zeit in diese Lösung investiert ....

    Gibt es eine einfache Lösung den Stack zum ausprobieren zu erhöhen??



  • ich hab gerade versucht das Problem so zu lösen, dass ich das feld halbiert habe also:

    float tabelle[86400][4];
    int j,k;
    j=0;
    k=0;
    
    for(int k=0;k<86400;k++)
    {
      for(int j=0;j<4;j++)
      {  
         tabelle[k][j]= 0;
      }
    }
    

    so.
    das feld wird anschliessend in ein .txt feld geschrieben.
    anschliessend will ich die zweite hälfte der daten verarbeitenund ebenfalls in ein .txt file schreiben.

    komischerweise läuft das programm beim ersten mal durch, beim zweiten mal bleibt es wieder hängen ... ?

    ist das das gleiche problem? ich verwende ja jetzt 2x das gleiche array,, also müsste der speicher ausreichen??

    gruß + dank



  • Wozu brauchst du eigentlich so ein riesen Array? Und was hast du gegen malloc(), bzw. besser noch calloc()?



  • ich brauche das array um Messdaten auzuwerten.

    jede Sekunde ein Messwert , das sind am Tag 86400 insg sind es 32 Kanäle die überwacht werden.

    Dummerweise liegen die Messwerte nicht in einem txtfile geordnet vor, sondern sind jeweils mit Zeitstempel in eigenen txt files, die sowohl nach Kanal und auch ungefähr im 4h tackt gestücklt vorliegen. Lücken etc gibts auch.

    Meine Idee ist also erstmal ein array zu erzeugen, in dem alle Kanäle und insbesondere alle Messwerte eines Tages zeitlich geordnet liegen, so dass ich die Messwerte dann weiter verarbeiten kann.

    Gerade habe ich noch, wie oben beschrieben, als Notlösung versucht, wenigstens 4 Kanäle auf einmal, nacheinander in eine zeitliche Ordnung zu bringen, anschliessend in ein txt file schreiben und dann mit Kanal 5-8 weitermachen. aber auch da läuft der Speicher während des zweiten Durchgangs über.
    ,,, gibt es da evtl eine Möglichkeit den Speicher nochmal freizugeben bzw das Programm neu zu initialisieren?? ich überschreibe das verwendete array ja im zweiten Durchgang nochmal,, da verstehe ich nicht wieso der Speicher überläuft.

    cooky451 schrieb:

    Und was hast du gegen malloc(), bzw. besser noch calloc()?

    nichts,, 🙂
    wie würde denn eine lösung damit aussehen??

    Danke und Grüße



  • Hast du es mal versucht, das Array statisch zu definieren? Dann wird es nicht auf dem Stack abgelegt, sondern im globalen Datenbereich (und dort ist idR mehr Platz als auf dem Stack).



  • CStoll schrieb:

    Hast du es mal versucht, das Array statisch zu definieren? Dann wird es nicht auf dem Stack abgelegt, sondern im globalen Datenbereich (und dort ist idR mehr Platz als auf dem Stack).

    wie würde das gehen?

    einfach so??

    static float tabelle[86400][4];
    .
    .
    .
    

    muss ich morgen mal probieren



  • #include <stdlib.h>
    
    int main()
    {
      int i;
      float **tabelle;
      tabelle = (float**)calloc(86400, sizeof(float*));
      if (!tabelle)
        FatalError(..); // Irgendeine Fehlerbehandlungsfunktion
      for (i = 0; i < 86400; ++i)
      {
        tabelle[i] = (float*)calloc(4, sizeof(float));
        if (!tabelle[i])
          FatalError(..);
      }
      // code...
      //
      for (i = 0; i < 86400; ++i)
        free(tabelle[i]);
      free(tabelle);
    }
    

    Ist allerdings etwas ungeschickt calloc() so oft aufzurufen. Schöner wäre es, viel Speicher auf einmal anzuvordern. Falls das static allerdings funktioniert, wird das wohl am besten sein..

    Und so eine Schleife zum initialisieren braucht ihr auch nicht, da reicht:

    int array[500] = {0};
    // oder
    int array[500];
    memset(array, 0, sizeof(array));
    

    Edit:
    Bei calloc müsst ihr natürlich gar nichts auf 0 setzen, das wird da schon von alleine gemacht!



  • CStoll schrieb:

    Hast du es mal versucht, das Array statisch zu definieren? Dann wird es nicht auf dem Stack abgelegt, sondern im globalen Datenbereich (und dort ist idR mehr Platz als auf dem Stack).

    Was soll denn der Unsinn?
    Globale Daten werden immer im Datensegment abgelegt, niemals im Stack, egal ob sie zur Scopeeinschränkung noch ein static erhalten oder nicht.



  • Wutz schrieb:

    CStoll schrieb:

    Hast du es mal versucht, das Array statisch zu definieren? Dann wird es nicht auf dem Stack abgelegt, sondern im globalen Datenbereich (und dort ist idR mehr Platz als auf dem Stack).

    Was soll denn der Unsinn?
    Globale Daten werden immer im Datensegment abgelegt, niemals im Stack, egal ob sie zur Scopeeinschränkung noch ein static erhalten oder nicht.

    Bisher sah der Code nicht so aus, als ob das Array global wäre - und dann hätte er auch keine Probleme mit dem Stack bekommen.



  • static hat funktioniert!

    danke hierfür!

    da das gerade etwas brennt, werde ich es erstmal so machen,, wenn ich zeit habe (höhö) setz ich mich nochmal dran und versuche es mit calloc.

    danke nochmal!


Anmelden zum Antworten