eXma » Diskutieren » Computer und Technik
Startseite - Veranstaltungen - Mitglieder - Suche
Vollständige Version anzeigen: C++ Segmentation fault
marco
hallo leute...

ich schon wieder mit ner c++ frage...
ich hab mein kleines feines programm...
das ganze is ein math. alg.

man stelle sich ein rechteck vor, in dem ein punkt mit best. eigenschaften liegt
ich versuche den punkt mittels einschließung zu finden... also zerteile ich das rechteck in 4
unterrechtecke usw...

der rödelt das ganze gut durch, bis er auf einmal "Segmentation fault" liefert...

nun die frage: WAS ZUM GEIER IS DAS?"

das komische is halt, dass der ploötzlich und mittendrin aufhört...
durch schrittweise ausgaben auf dem bildschirm, weiß ich ungefähr, wo der hängt...
CODE

double allesdoof(double* ai, int A, int B, int n, double N, int k){
cinterval pz,pA, pB;
cout << "hallo" << endl;
cout << "N: " << N << endl;
cout << "n: " << n << endl;
cout << "k: " << k << endl;
cout << "ai: " << ai[0] << endl;
cout << "A: " << A << endl;
cout << "B: " << B << endl;

und ausgegeben wird:

hallo
Segmentation fault

davor kommt der ohne probleme durch diese stelle...

woran kann es denn liegen???

danke m.


CoolSun
Wirds nicht mal langsam Zeit für ein gutes Buch? Oder nen Exma-internen Informatik-FB?
marco
Zitat(CoolSun @ 16 Apr 2008, 19:08)
Wirds nicht mal langsam Zeit für ein gutes Buch?  Oder nen Exma-internen Informatik-FB?
*


naja... das sind schon spezielle sachen... is ja nicht, dass ich mir ne for-schleife erklären lasse...
abgesehen davon sollte ein forum dafür da sein, oder...
Chris
am Besten erst einmal Bekanntschaft mit einem Debugger schließen, um das Problem differenziert
darzustellen. valgrind oder gdb sind gute Adressen. Hilfreich könnte auch strace sein.

Ohne weitere Infos wirste bei c++ kaum dahinter kommen, wo dein Problem liegt. Segmentation fault
deutet doch stark auf einen fehlerhaften Speicherzugriff zu.
stth
versuchs mal in Foren die darauf spezialisiert sind. lies vorher mal ne FAQ und google nach deinem Problem. weiterhin kannst du auch einen deiner älteren c++ threads mit denen du uns ja schon öfters beehrt hast benutzen... (zumindest für das nächste Problem)
CoolSun
Zitat(marco @ 16 Apr 2008, 19:11)
... is ja nicht, dass ich mir ne for-schleife erklären lasse...
abgesehen davon sollte ein forum dafür da sein, oder...
*


Wir erledigen aber nicht deine Belegarbeiten... no.gif
marco
Zitat(CoolSun @ 16 Apr 2008, 19:42)
Wir erledigen aber nicht deine Belegarbeiten... no.gif
*

oh... entschuldigung... haste ja bis jetzt auch ni gemacht...
es gibt halt studenten, die anderen helfen, wenn die ne frage haben auf einem gebiet, wo se ni bis ins
kleinste detail fit sind...
wenn du nicht helfen willst, dann mach es nicht und fang nicht an zu weinen...
aktsizr
Vielleicht gibt es ein ai[0] irgendwann nicht mehr? Oder ai dereferenziert auf einen Speicherbereich, der nicht zur Verfügung steht, weil ai vielleicht nicht korrekt initialisiert ist? Es gibt für gcc/g++ einen Debugger genannt `gdb'. Versuche doch mal deinen Code mit g++ -g -ggdb zu kompilieren und anschliessend gdb aufzurufen. Dann noch `run ./meinprogramm' und wenn du Glück hast, zeigt dir der Debugger dann schon recht präzise wo es probleme gibt. Mit help kriegst du eine Hilfe. Vielleicht mal die Befehle `info regs', `bt', und `x' ausprobieren. Literatur wie üblich im Internet.
Knurt
-
stabilo
Also.
Wie schon angesprochen wurde. Buch hilft. Und segfault ist nix "spezielles". Du greifst auf Speicherbereiche zu, in denen du nichts zu suchen hast. Durch deine Iteration - wie auch immer die aussieht, werden sicher irgendwelche Pointer oder Zählvariablen verändert. Entweder greift irgendwann dein Pointer in geschütze Bereiche oder eine deiner Zählvariablen wird über ihre Obergrenze hinaus erhöht.
Leider hast du ja nur eine nichtssagende Dummyfunktion gepostet. Da fliegt vll. der Fehler aber die Ursache liegt anderswo.

Für Programmierfragen wende dich doch mal an die Kompetenzen im HnH smile.gif

btw. "Was ist das?" Das ist das

edit:
Sehe gerade, dass aktsizr ja schon alles gesagt hat. Naja. Doppelt und so..
marco
kann es sein, dass es sich dabei um ein mac-problem handelt?
hab bei ein bissl googlen festgestellt, dass es ziemlich viele mac-user mit diesem problem gibt...

kennt sich da jemadn aus, um das zu beheben???
danke m.

ps: ich greif definitiv auf keine resource zu, die nicht auch richtig ist...

ich lass mir doch vor dem funk-aufruf alle variablen die da reinkommen ausgeben...
und als erstes nach den funk-start auch nochmal und da kommt der fehler...
das is ja das komische...

es kann sein, dass er speicherprobleme hat, aber was kann ich dagegen machen...
ich programmier meiner meinung nach sehr sauber... und da kommt so ein mist völlig ungelegen...

alles scheiße, dein marco...
wicked
Zitat(marco @ 17 Apr 2008, 15:11)
kann es sein, dass es sich dabei um ein mac-problem handelt?

Erst den Fehler bei sich selbst (und im eigenen Code suchen), dann Hersteller verunglimpfen.

Wenn der Fehler tatsächlich in der Funktion auftritt und danach nix relevantes kommt kann nur
CODE
cout << "ai: " << ai[0] << endl;

das Problem sein; ai zeigt auf einen Speicherbereich auf den dein Programm nicht zugreifen darf.
Da mußt du in Ruhe nochmal schauen ob du falsch/nicht allokiert hast oder den ersten Parameter falsch übergibst...
Chris
Zitat(marco @ 17 Apr 2008, 15:11)
es kann sein, dass er speicherprobleme hat, aber was kann ich dagegen machen...
ich programmier meiner meinung nach sehr sauber... und da kommt so ein mist völlig ungelegen...
*


Was kann man bloss dagegen machen? Erstmal versuchen mit diesem Programm - wie nennen es
doch alle? - Debugger klar zu kommen. Und wenn du das verstanden hast, dann kannst du damit
beginnen das Problem einzukreisen. Und wenn du dann genau weißt was das Problem ist, kannst du
hier nocheinmal fragen, was man dagegen tun kann.
marco
Zitat(Chris @ 17 Apr 2008, 15:53)
Was kann man bloss dagegen machen? Erstmal versuchen mit diesem Programm - wie nennen es
doch alle? - Debugger klar zu kommen. Und wenn du das verstanden hast, dann kannst du damit
beginnen das Problem einzukreisen. Und wenn du dann genau weißt was das Problem ist, kannst du
hier nocheinmal fragen, was man dagegen tun kann.
*

also ich habs mir mal ein bissl mit m debugger angeschaut...
und der läuft genau bis dahin sauber durch und verliert einfach durch den funk-aufruf die werte...

das ganze passiert mehrmals, weil rekursiv... also greife ich die ganze zeit auf die werte zu und auf
einmal will er nicht mehr...

mir scheint, dass es ein mac-problem is... vielleicht mach ich das ganze nächste woche mal auf nem
linux ding... ma guggen...

aber vielleicht hat ja ein apfel-mensch nen hinweis...

ich wette, dass ich da nur am anfang eine befehlszeile einfügen muss, damit dieses mac-problem
unterbunden wird...
aktsizr
Zitat(marco @ 17 Apr 2008, 15:59)
also ich habs mir mal ein bissl mit m debugger angeschaut...
und der läuft genau bis dahin sauber durch und verliert einfach durch den funk-aufruf die werte...

das ganze passiert mehrmals, weil rekursiv... also greife ich die ganze zeit auf die werte zu und auf
einmal will er nicht mehr...

mir scheint, dass es ein mac-problem is... vielleicht mach ich das ganze nächste woche mal auf nem
linux ding... ma guggen...

aber vielleicht hat ja ein apfel-mensch nen hinweis...

ich wette, dass ich da nur am anfang eine befehlszeile einfügen muss, damit dieses mac-problem
unterbunden wird...
*


...das ist ganz sicher kein mac Problem.
marco
Zitat(aktsizr @ 17 Apr 2008, 17:04)
...das ist ganz sicher kein mac Problem.
*

ok... dann lasst es mich anders ausdrücken:
CODE


int do_something(int a, int b, int* c){
   cout << "a1" << a << endl;
   cout << "b1" << b << endl;
   a=a+b;
   b=2*b;
   cout << "a2" << a << endl;
   cout << "b2" << b << endl;
   do_something(a,b,c);
   }

das macht der super ein paar mal...
aber nach dem x-ten mal, bringt der die fehlermeldung...
da steht dann quasi (z.B.):
a1 100
b1 1000
a2 1100
b2 2000
Segmention fault... blabla...
sprich, der geht wieder in die funk rein, aber stirbt dort ab...
mit dem array (wo ein fehlzugriff stattfinden könnte, passiert gar nix!!!)

ich hab echt keine ahnung, wo da der fehler liegen sollte...
Chris
Speicherüberlauf? Wie groß ist denn das x?

Befrage doch mal strace oder valgrind um einen Trace des Problems zu bekommen ...
tingel
Könnte sein, daß du durch die Rekursion an die Begrenzung der Stack Größe stößt. Frag' mich jetzt nicht, wie man das genau auf OS X herausbekommt.

/edit: gibt es auch irgendeine Abbruchbedingung in dem Codesnipplet? Ich sehe keine...
marco
Zitat(tingel @ 17 Apr 2008, 19:03)
Könnte sein, daß du durch die Rekursion an die Begrenzung der
Stack Größe stößt. Frag' mich jetzt nicht,
wie man das genau auf OS X herausbekommt.

/edit: gibt es auch irgendeine Abbruchbedingung in dem Codesnipplet? Ich sehe keine...
*



das klingt, als könnte es mein problem sein... wußte gar ni, dass es sowas heutzutage noch gibt...
mist...

da schau ich mal...

wie würde ich es unter linux lösen???

ps: natürlich gibt es ne abbruch-ding... hab ich der einfachhet weggelassen...

einfach wenn a>1mio, dann return (z.B.)
CoolSun
Zitat(marco @ 17 Apr 2008, 19:21)
d

ps: natürlich gibt es ne abbruch-ding... hab ich der einfachhet weggelassen...

einfach wenn a>1mio, dann return (z.B.)
*


int a hat aber nur 32.000 ???
tingel
Wenn die Variablen, die du rekursiv übergibst, nach dem Aufruf nicht mehr gebraucht werden, könntest du die global machen, anstelle die als Argument zu übergeben. Das ist natürlich nicht schön, aber reduziert die Menge der Daten, die der Aufruf auf den Stack legt.
Wenn das möglich wäre, stellt sich natürlich die Frage, ob man die Rekursion nicht gleich durch eine Schleife ersetzen kann...
wicked
Zitat(CoolSun @ 17 Apr 2008, 19:27)
int a hat aber nur 32.000 ???

"Kommt drauf an", sowohl C als auch C++ Standard schreiben nur minimale Breiten vor (16 oder 32 Bit derzeit, blame my memory).
Zitat(tingel @ 17 Apr 2008, 19:36)
Wenn das möglich wäre, stellt sich natürlich die Frage, ob man die Rekursion nicht gleich durch eine Schleife ersetzen kann...

Full ack.
Schneller, platzsparender, ...