Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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!

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...