Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

feld zu groß für array oder array zu groß

Empfohlene Antworten

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

Lass Dir Speicher zur Laufzeit zuweisen (malloc, free).

an welcher stelle im source kommt den der fehler? beim init der Variablen?

Achja sonst such doch einfach mal na ch doppelt ferketteter liste.

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

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.

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.

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!

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.