xaviar Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 Hi, mein Problem besteht in der Größenbeschränkung der arrays im c-Programm. Wenn ich die zweidimensionalen array größer als ca. 50000 Felder (40x2010) mache bekomme ich eine Fehlermeldung mit: " *.exe hat ein Problem festgestellt und muss beendet werden" Dieser Fehler scheint auch nicht nur von der Feldgröße, sondern auch von der Anzahl an Feldern im Programm abzuhängen. Aufgrund meiner Aufgabenstellung benötige ich aber eine größere Auflösung und damit ein größeres Feld. Kann mir irgend jemand die Ursache für diese Beschränkung und ggf. eine Lösungsmöglichkeit geben. Ich bin verzweifelt. Danke im Voraus Randbedingungen: Betriebssystem: Windows xp Entwicklungsumgebung: dev-c++ 4.9.9.2 Progemmiersprache: c Progemmausschnitt: #include <math.h> #include <stdio.h> #include <stdlib.h> #define feld1 40 #define feld2 1210 int main(void) { double lam1[feld1][feld2]; ... system("pause"); return 0; } Anzahl der Felder 2d: 5 1d-feld1: 1 1d-feld2: 7 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 Lass Dir Speicher zur Laufzeit zuweisen (malloc, free). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
U-- °LoneWolf° Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 an welcher stelle im source kommt den der fehler? beim init der Variablen? Achja sonst such doch einfach mal na ch doppelt ferketteter liste. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
xaviar Geschrieben 7. Januar 2008 Autor Teilen Geschrieben 7. Januar 2008 Hi, vielen Danke erstmal ich sollt vielleicht erwähnen, dass meine c-Erfahrung sich auf einfache methematische Rechnungen und Schleifen beschränkt. Lass Dir Speicher zur Laufzeit zuweisen (malloc, free). Also, ich hab noch nie mit den beiden Befehlen gearbeitet, aber wie ich durch rumsuchen gesehen habe, scheint der Speicher damit nicht sofort zugewiesen zu werden, sondern der genutzte Speicher vergrößert sich mit jedem neuen Element. Aber da die Größe des Arrays auf jeden Fall vollständig genutzt wird (sprich alle Elemente mit double-Werten gefüllt) würde es mir ja nicht weiterhelfen, oder? an welcher stelle im source kommt den der fehler? beim init der Variablen? ja Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 Also, ich hab noch nie mit den beiden Befehlen gearbeitet, aber wie ich durch rumsuchen gesehen habe, scheint der Speicher damit nicht sofort zugewiesen zu werden, sondern der genutzte Speicher vergrößert sich mit jedem neuen Element. "malloc" holt sofort einen zusammenhängenden Speicherblock oder schlägt fehl. Mit "free" gibst Du den Speicherblock wieder frei. Da Du sagst, bisher wenig mit C zu tun gehabt zu haben, ein wenig Beispielcode (kein lauffähiges Programm): #include <stdlib.h> #include <malloc.h> /* ... */ double *feld; int spalten; int zeilen; /* ... */ spalten = 20; zeilen = 1000; /* ... */ feld = (double *) malloc(zeilen * spalten * sizeof(double)); if(feld != NULL) { /* Beispiel fuer Zuweisung in Zeile z = 8 und Spalte s = 9 bei zeilenweise Organisation des Feldinhaltes (falls spaltenweise Organisation günstiger ist, analog vorgehen, also die Spalteninhalte hintereinander im Speicher ablegen): */ feld[z * spalten + s] = 123; /* Wenn das Feld nicht mehr benötigt wird, den Speicher freigeben: */ free(feld); } else { /* Fehler: Speicher nicht erfolgreich erhalten */ } Tippfehler können vorhanden sein, ich hab's nicht extra getestet. "/* ... */" soll lediglich mögliche Einschübe von weiterem Code andeuten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 Die Fehlermeldung ist natürlich sehr allgemein, aber 50000 Elemente sind natürlich schon relativ viel Speicher, der Stack, also der Bereich in dem deine lokalen Variablen liegen, ist aber beschränkt. An welcher Stelle tritt denn der Fehler bei dir genau auf? Wie schon gesagt kannst du über malloc zur Laufzeit dynamisch Speicher auf dem Heap anfordern, den du dann aber auch selber adressieren und verwalten musst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
xaviar Geschrieben 9. Januar 2008 Autor Teilen Geschrieben 9. Januar 2008 Hi, ich habe mal ein wenig mit malloc rumexperimentiert, aber es scheint das Problem auch nicht zu lösen. Es kommt die gleiche Fehlermeldung. Der Fehler kommt direkt in der Initialisierung der Variablen. Inzwischen habe ich das Programm aber auch mal auf meinem anderen Rechner laufen lassen und da scheint das Problem erst ab ca. 140000 array-elementen (x[67][13000]) zu bestehen. Das reicht mir. Also scheint er wirklich Probleme mit den stack (?) gehabt zu haben. Warum auch immer mein anderer Rechner nen größeren hat, weiß ich nicht. Vielen lieben Dank nochmal! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 9. Januar 2008 Teilen Geschrieben 9. Januar 2008 ich habe mal ein wenig mit malloc rumexperimentiert, aber es scheint das Problem auch nicht zu lösen. Es kommt die gleiche Fehlermeldung. Dann hast Du noch einen Fehler drin. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.