Speicherproblem mit Feld



  • Hallo Leute,

    ich verwende ein Feld in C vom Typ short, mit der Größe 2^21
    Durch die Deklaration

    static signed short feld[2097152];

    sollte doch genug Speicher zur Verfügung stehen.
    Wenn ich jetzt als Test mit einer for Schleife lauter 0 in das Feld schreibe geht alles gut, bei lauter -1 stürzt das Programm ab. Ich bin mir sicher, daß es ein Speicherproblem ist. Wenn die For Schleife bei den -1 begrenzt wird (also nicht alle Stellen voll geschrieben werden) stürzt das Programm nicht ab. Weiß jemand, was ich da machen kann?

    Ich starte auf einem modernen Linux-PC mit großem Arbeitsspeicher, das sollte doch gehen?

    Danke, Gruß, Lucky



  • Zeig doch mal, wie die Schleife aussieht - und wie die genaue Fehlermeldung lautet.

    (btw, bei so großen Werten bietet sich eine benannte Konstante an - da kann ein einfacher Zahlendreher schon zu großen (und schwer erkennbaren) Problemen führen)



  • Dein Compiler legt fest, wie groß die maximale Anzahl der Felder sein kann. Vielleicht solltest du das bedenken.



  • Hallo CStoll,

    danke für Deine Antwort.
    Die Schleife ist ja nur zum Testen:

    for(i=0;i<=2097152;i++)
    {
    feld[i]=0;
    }

    In Wirklichkeit wird aus einer Datei gelesen, in welcher in jeder Zeile eine einstellige Ziffer steht, allerdings auch negative Zahlen. Ich habe festgestellt, je nachdem welche Folge in der Datei steht, geht es manchmal und manchmal nicht.
    Das liegt wohl an der Anzahl der negativen Zahlen. Brauchen die mehr Speicher?
    Ich dachte short ist short = 2 Byte?

    Müßte für das Feld nicht durch die Initialisierung Speicher reserviert sein? Sind ja "nur" gut 4MB.

    @Zeh Mau

    Die maximale Anzahl der Felder oder die maximale Anzahl der Stellen in einem Feld?
    Dieses Problem kann es aber m.E. nicht sein, da es für manche Zahlenfolgen ja funktioniert.

    Gruß, Lucky



  • for(i=0;i<=2097152;i++)
    {
    feld[i]=0;
    }
    

    Und da ist ja auch schon das Problem:
    Ein Feld, dass 2097152 Elemente besitzt, kannst du nur von 0 bis 2097151 indizieren. Deine Schleife oben greift aber auch auf das Element 2097152 zu, das über das Array hinausgeht...
    Richtig wäre:

    for(i=0;i < 2097152;i++)
    {
    feld[i]=0;
    }
    

    Grüße

    Martin


Anmelden zum Antworten