dachschatten Geschrieben 12. April 2007 Geschrieben 12. April 2007 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
steinadler Geschrieben 12. April 2007 Geschrieben 12. April 2007 Ich denke, ohne deinen Code lässt sich hier nicht viel machen...
dachschatten Geschrieben 12. April 2007 Autor Geschrieben 12. April 2007 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
Guybrush Threepwood Geschrieben 12. April 2007 Geschrieben 12. April 2007 Wie ist koeff den deklariert und was hast du vor der Schleife schon damit gemacht?
steinadler Geschrieben 12. April 2007 Geschrieben 12. April 2007 Was steht in MAX_CONSERVATIVE und wie ist Koeff deklariert? Wie groß?
dachschatten Geschrieben 12. April 2007 Autor Geschrieben 12. April 2007 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
dachschatten Geschrieben 12. April 2007 Autor Geschrieben 12. April 2007 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.
Guybrush Threepwood Geschrieben 12. April 2007 Geschrieben 12. April 2007 hmm ich würde sagen das du dir den Speicher schon vorher irgendwo zerschießt, das da aber erst auffällt.
Klotzkopp Geschrieben 12. April 2007 Geschrieben 12. April 2007 Das erste fprintf wird ausgefuert, das zweite nicht mehr.Dann vermute ich, dass du dir schon vorher, wahrscheinlich durch eine Bereichsüberschreitung, den Heap zerlegt hast. Benutzt du eigentlich C oder C++?
dachschatten Geschrieben 12. April 2007 Autor Geschrieben 12. April 2007 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.
Guybrush Threepwood Geschrieben 12. April 2007 Geschrieben 12. April 2007 Evtl hilft dir Valgrind Home weiter.
dachschatten Geschrieben 12. April 2007 Autor Geschrieben 12. April 2007 Danke, das klingt gut, ich muss mal den Sysadmin fragen ob er es installiert.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden