7. Januar 200817 j 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
7. Januar 200817 j an welcher stelle im source kommt den der fehler? beim init der Variablen? Achja sonst such doch einfach mal na ch doppelt ferketteter liste.
7. Januar 200817 j 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
7. Januar 200817 j 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.
7. Januar 200817 j 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.
9. Januar 200817 j 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!
9. Januar 200817 j 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.