dachschatten Geschrieben 12. April 2007 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 Ich denke, ohne deinen Code lässt sich hier nicht viel machen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dachschatten Geschrieben 12. April 2007 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 Wie ist koeff den deklariert und was hast du vor der Schleife schon damit gemacht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 Was steht in MAX_CONSERVATIVE und wie ist Koeff deklariert? Wie groß? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dachschatten Geschrieben 12. April 2007 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 und wo kommt nr_of_koeff her??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dachschatten Geschrieben 12. April 2007 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. April 2007 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. April 2007 Teilen 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++? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dachschatten Geschrieben 12. April 2007 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 Evtl hilft dir Valgrind Home weiter. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dachschatten Geschrieben 12. April 2007 Autor Teilen Geschrieben 12. April 2007 Danke, das klingt gut, ich muss mal den Sysadmin fragen ob er es installiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.