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.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen!

Ich schreibe an einem Programm zur numerischen Lösung partieller DGLen in C. Dieses Programm kompiliert auch ohne zu mucken.

Zum Starten bekommt es dann noch einige Daten per in_File übermittelt, wie zB die Integrationsordnung und die Diskretisierung des Integrationsgebietes.

Mein Problem: Rechne ich auf Diskretisierung A, funktioniert zwar Ordnung 1, bei Ordnung 2 erhalte ich die Meldung "segmentation fault (core dumped)".

Rechne ich auf Diskretisierung B, funktioniert sowohl Ordnung 1 als auch 2.

Die Zeile, in der das Problem auftritt ist eine Speicherallozierung durch malloc (kombinert mit groesse*sizeof(double)), deren Groessenordnung von der Ordnung abhängt. Meiner Meinung nach und auch nach Meinung des Compilers (g++ mit Option -02 -Wall -pedantic) ist die Syntax korrekt.

Als das Problem an anderer Stelle schon einmal auftauchte, hab ich es erst mal umgangen indem ich einfach dem Array eine feste Groesse zuwies. Aber das ist natürlich auf Dauer auch kein Zustand...

Für jede Hilfe und jeden sachdienlichen Hinweis zur Loesung dieses Problems waere ich sehr dankbar.

Liebe Gruesse

dachschatten

Hmmm, das sind ein paar tausend Zeilen...

Der Abschnitt indem das Problem konkret auftritt ist

for(i = 0; i < MAX_CONSERVATIVE; i++)

{

fprintf(stderr, "r_f_w, speicherallokation fuer koeff\n");

koeff = (double *)malloc(nr_of_koeff*sizeof(double));

fprintf(stderr, "r_f_w, speicher\n");

if(NULL == koeff)

fatal_error("Not enough memory!");

}

Das erste fprintf wird ausgefuert, das zweite nicht mehr.

Vielleicht kannst Du mir einen Hinweis geben nach welcher Art von Fehler ich suchen sollte.

Sonnige Gruesse (ist es nicht schoen draussen??!!!)

Dachschatten

Hallo,

MAX_CONSERVATIVE ist die Anzahl der Konservativen Variablen der 2D-Flachwassergleichung, eine Konstante mit Wert 3.

Und koeff wird direkt ueber dem geposteten Abschnitt deklariert als Pointer

double *koeff[MAX_CONSERVATIVE];

Sonnige Gruesse

dachschatten

nr_of_koeff ist die noetige Anzahl von Koeffizienten fuer ein Rekonstruktionspolynom vom Grad Ordnung-1 in 2D, für Ordnung 2 also 3. (Ordnung1 braucht nur 1 Koeffizienten des konstanten Polynoms vom Grad 0). nr_of_koeff wird irgendwo am Anfang von main.c, nach dem Einlesen des in-files, berechnet.

Der Sinn der Funktion, aus der der gepostete Abschnitt stammt, ist es, fuer jede der drei Variablen ein 2D-Polynom zu bestimmen, deren Koeffizienten dann in koeff gespeichert (und spaeter weiterverarbeitet) werden.

Ja, dass ich mir irgendwo vorher den Heap zuerschiesse glaub ich auch, aber gibt es eine Moeglichkeit, herauszufinden wo, oder ist da Handarbeit gefragt?

Ich war schon nah dran mich einfach mal mit malloc-Einfuegen durch den Programmtext nach oben zu arbeiten aber das ist ne ziemlich unsexy Vorstellung...

Was passiert eigentlich, wenn der Heap voll ist? Dann sollte malloc doch nen NULL-Zeiger zurueckgeben, was ja dann zur Fehlermeldung "not enough memory" fuehren sollte, oder?

Ich verwende uebrigens C, aber aus irgendwelchen Gruenden muss das Ganze als C++ kompiliert werden.

Danke, das klingt gut, ich muss mal den Sysadmin fragen ob er es installiert.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

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.