Speicherzugriffsfehler bei zu großem Array



  • Bene schrieb:

    Der Rechner hat aber 512 mb ram und dann nochmal soviel swap auslagerungsspeicher. Irgend ne andere idee? ^^###

    Du legst die Arrays auf dem Stack an. Der ist üblicherweise begrenzt. Du musst den Heap benutzen, Stichwort malloc. In den FAQ sollte genug über dynamische Speicherallokation stehen.

    Zu der anderen Frage: wie kann ich in C die n-te Wurzel aus einer Zahl ziehen?

    Mit der Funktion pow.



  • Ich bekomme aber kein Stack-Overflow, sondern einfach nur einen Speicherzugriffsfehler... Is das denn das gleiche?



  • Stackoverflow hat damit nichts zu tun. Die bekommst Du z.B. wenn Du in einer rekursiven Funktion die Abbruchbedingung vermurkst und dabei für jeden weiteren Aufruf der Funktion die Rücksprungadresse auf den Stack geschrieben wird.
    Er meinte das automatische Variablen auf dem Stack allokiert werden und dynamische Variablen auf dem Heap. Aber selbst auf dem Heap kann es passieren, das nicht genug freier Speicher in einem zusammenhängenden Block verfügbar ist.

    Aber eigentlich hatte ich einen bad alloc oder ähnliches erwartet (allerdings verwende ich einen C++-Compiler).

    Grüße Joe_M.



  • Wie kann ich das dann umgehen? Ich bin wie gesagt relativer Neuling und hab mit diesem Speicherkram noch ned den vollen Durchblick. Es wäre für mich sehr wichtig mindestens 1000*10000 zu schaffen (tmax=1000 und rlmax=10000). Bin scho total verzweifelt. Das mit der dynamischen Methode versteh ich ned so ganz...

    Und nur nochma damit ich mir sicher bin: Stack ist ein Speicherbereich, der für automatische Variablen verwendet wird und Heap einer für dynmische?

    Ciao und danke, dass ihr mir alle so helft 🙂



  • int dx = 5, dy = 8, x, y;
    int **array = malloc(sizeof(int*) * dy); // ein array von pointern
    for (y = 0; y < dy; ++y) array[y] = malloc(sizeof(int)*dx);
    /* Zugriff: array[y][x] */
    for (y = 0; y < dy; ++y) free(array[y]); // das Freigeben des Speichers ist WICHTIG!
    free(array);
    


  • Ich hab jetzt alles so gemacht, bekomm aber immernoch meinen Speicherzugriffsfehler... 😞
    Kann ma da garnix machen?

    Viele Grüße, Bene



  • gib mal ein minimales programm, bei dem du diesen fehler reproduzieren kannst. also "hallo welt" mit crashroutine.



  • Hey! Es scheint jetzt zu funktionieren, vorhin hat er nur abgebrochen, weil ich das Proggie auf nem anderen Rechner über ssh kompilier und teste und mein Kumpel da den Prozess abgeschossen hat, weil er zu viel Ressourcen gefressen hat. 😉

    Aber ich hätte noch eine andere Frage... Beim geometrischen Mittel werden ja die einzelnen Werte aufmultipliziert und bei einem Mittel über 10000 oder mehr Werte ergibt sich da eine ziemlich große Zahl, die mit Sicherheit größer als 4294967295 ist. Wie kann ich mit einer so großen Zahl rechnen?



  • Bene schrieb:

    bei einem Mittel über 10000 oder mehr Werte ergibt sich da eine ziemlich große Zahl, die mit Sicherheit größer als 4294967295 ist. Wie kann ich mit einer so großen Zahl rechnen?

    typ double, ungenau aber der haelts aus.
    oder such dir ne bigint library (gmp z.b.)

    hab mal grad was getestet.
    die zahlen 1-999 aufmultipliziert ergibt 4.024E2564. das schafft kein double.



  • ok, problem hat sich bei mir gelöst... Hab einen guten Tip bekommen... Die Werte werden im Anschluss ja noch logarithmiert, d.h. man kann auch jeden Wert logarihtmieren und die dann aufaddieren anstelle alle aufzumultiplizieren und dann erst log() anzuwenden... 😉 Es lebe die Mathematik XD


Anmelden zum Antworten