Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Diskussion über "Den richtigen Code posten: reduziertes compilierbares Beispiel"  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17983
Beitrag SeppJ Moderator 14:15:36 30.05.2012   Titel:   Diskussion über "Den richtigen Code posten: reduziertes compilierbares Beispiel"            Zitieren

pumuckl schrieb:
Wie man Probleme nachstellbar und nachvollziehbar macht
Oft findet man hier im Forum Fragen von Neulingen mit Problemen beim Übersetzen ihrer Programme oder zur Laufzeit. Manche liefern dazu garkeinen Code, andere nur spärliche Brocken oder aber hunderte irrelevanter Zeilen, wieder andere posten ungetesteten Pseudocode, der haufenweise Proleme hat, nur nicht das, um welches es geht. Weder mit dem einen noch mit dem anderen Extrem ist uns und euch geholfen, daher soll hier ein kleines Tutorial folgen, wie man den relevanten Code postet - und nur den.

Wenn der Code nicht kompiliert/linkt
Es muss zwischen Compilerfehlern und Linkerfehlern unterschieden werden. Erstere haben auf allen aktuellen Compilern eine Angabe der Quelldatei und der Zeile, in der der Fehler auftritt. Letztere haben das nicht immer. Unter MSVC haben Compilerfehler einen Fehlercode Cxxxx und Linkerfehler LNKxxxx, wobei xxxx eine Ziffernkombination ist.
Grundsätzlich solltest du immer die Fehlermeldung mit angeben, allerdings auch nur eine, nicht einen ganzen Haufen. Nach einem Fehler sind andere Fehlermeldungen häufig Folgefehler, auch wenn man das nicht auf den ersten Blick sieht. Versuche auf jeden Fall, die Meldung zu verstehen, um zu wissen, was zum Fehler gehört und was nicht. Ein paar Brocken Englisch sind (bei englischen Compilern) von Nutzen. Wenn du Wörter aus den Fehlermeldungen nicht verstehst, lass sie dir übersetzen oder google nach den Fachbegriffen - oder der gesamten Fehlermeldung.
Gib von vornherein an, welchen Compiler und welche IDE du benutzt (nicht verwechseln!), außerdem ist es gut zu wissen, welche Compileroptionen du gewählt hast (wenn du einfach aus der IDE heraus baust ohne was geändert zu haben sag das explizit dazu). Beachte Warnmeldungen und poste sie ggf. auch noch. Die meisten Warnungen weisen auf mögliche Fehlerquellen hin und sollten behoben werden.

Linkerfehler
Linkerfehler sind sehr häufig fehlende Funktions- oder Variablendefinitionen. Siehe dazu den FAQ-Eintrag zu undefined references.
Das Gegenteil dazu ist der Fehler "multiple definition of..." - er erscheint meist, weil eine globale Variable oder eine freie, nicht-inline Funktion in einem Header definiert wurde.

Linkerfehler beziehen sich meistens auf ein bestimmtes Symbol, d.h. einen Funktionsnamen oder Variablennamen. Jeder Code, der diesen Namen enthält, ist hierbei relevant, d.h. aufrufende Funktionen, die Funktion/Variable selbst, die zugehörige Klasse, wenn es sich um eine Methode handelt. Beim Reduzieren des Codes (s.u.) sollten unbetiligte Funktionen und Variablen komplett entfernt werden. Wenn sich die Fehlermeldung auf eine Funktion bezieht, kann ihre Funktionalität normalerweise auf wenige Zeilen reduziert werden.

Compilerfehler
Compilerfehler betreffen normalerweise nur eine Handvoll Variabeln und Funktionen. Für das Nachstellen solcher Fehler wird nur eine .cpp und die (direkt oder indirekt) eingebundenen Header benötigt, alles weitere ist überflüssig. Tritt der Fehler in einer Funktionsdefinition auf, dann ist das die einzige Definition die man braucht, alle anderen Funktionen dürfen beim Reduzieren auf Deklarationen zusammengeschrumpft werden (beteiligte Funktionstemplates ausgeschlossen).

Ein einzelner Compilerfehler kann bei Templates viele Zeilen umfassen, wenn eine fehlerhafte Benutzung eines Templates an einer Stelle erst viele Instantiierungsstufen tiefer zu einem Fehler führt. Bei Template-Fehlern (z.B: in der Standardbilbiothek) solltest du daher immer sicherstellen, dass du die wesentlichen Teile der kompletten Fehlermeldung einsetzt, nicht nur die erste Zeile. Dazu gehören vor Allem die Zeilen, die deinen eigenen Code betreffen und der eigentliche Fehler.

Laufzeitfehler
Laufzeitfehler sind am schwierigsten zu reduzieren, weil hier oft nicht klar ist, in welcher Ecke was schief läuft. Aus dem Grund ist es wichtig, den Fehler zu lokalisieren, dazu ist es unumgänglich, sich mit der Benutzung eines Debuggers vertraut zu machen.
Wenn das Debuggen nichts hilft, können wir natürlich gerne weiterhelfen. Dazu brauchen wir neben dem Code eine möglichst genaue Beschreibung des Verhaltens, das ihr erwartet und des Verhaltens, das ihr tatsächlich bekommt.

Den Code reduzieren
Wenn du hier ins Forum kommst um eine Lösung für das Problem zu finden, heißt das, dass du schon einige Zeit suchst (bei Google, in deinem Code, im Buch deiner Wahl...). Um hier zügig eine Antwort zu bekommen investierst du am Besten noch ein kleines Bisschen mehr Zeit in die Kürzung und FOrmatierung deines Codes, und das geht so:

  • Sichere deinen Code und lege eine Kopie davon an. (z.B. einen neuen branch in deiner Versinskontrolle) Von jetzt an arbeitest du auf der Kopie.
  • Lösche großzügig die Teile raus, von denen du sicher bist, dass sie zum Problem nichts beitragen. (Funktionen, Klassen, #includes, ...)
  • Übersetze den Code und stell sicher, dass du genau die selben Fehler hast wie vorher, nicht mehr und nicht weniger.
  • Ersetze komplizierte Funktionalität Schrittweise durch was einfacheres, z.B. Funktionsaufrufe durch dummy-Werte usw. Auf die Weise reduzierst du die Abhängigkeiten deines Codes von weiteren Headern usw., die du dadurch auch rauswerfen kannst.
  • Übersetze nach jedem Schritt und stell sicher, dass du genau die selben Fehler hast wie vorher, nicht mehr und nicht weniger.
  • Verkleinere deine Klassen: entferne Membervariablen und Methoden, die den Fehler nicht beeinflussen.
  • Übersetze...
  • Ersetze #includes von eigenen Headern durch den Inhalt der Header, so dass du weniger Dateien bekommst.
  • Wenn du in einem der Schritte neue Fehler bekommst, behebe sie oder mache den Schritt rückgängig.
  • Wenn du in einem der Schritte deinen Fehler nicht mehr bekommst, denk drüber nach, ob dir das einen Hinweis gibt, woher der Fehler kommen könnte. Mache den Schritt rückgängig (Versionskontrolle hilft!) und fahre mit kleineren Schritten fort, den Fehler einzukreisen.

Du kommst zu einem Punkt, in dem du den Code nicht mehr weiter reduzieren kannst. Typischerweise hast du ca. 20-60 Zeilen, verteilt auf 1-5 Dateien.
Diesen Code kopierst und postest (nicht Abtippen!) du jetzt komplett zu deiner Fragestellung (und Fehlermeldung, Compiler, -optionen...):
  • Lasse nichts weg, damit wir den Code einfach nur zu kopieren brauchen um den Fehler nachstellen zu können.
  • Benutze die [cpp]-Tags (Button "C/C++" unter den Smileys)
  • Rücke deinen Code ordentlich ein (hast du ja sicherlich sowieso, oder?)
  • Schreibe mit Kommentaren die Namen der einzelnen Sourcen und Header vor die Codeabschnitte
  • Trenne den Code verschiedener Dateien sichtbar voneinander - entweder durch mehrere Leerzeilen oder indem du sie jeweils in einen eigenen [cpp]-Tag setzt.

Zu viel Aufwand? Du möchtest, dass sich zig Leute hier mehr als nur einen Augenblick mit deinem Problem beschäftigen. Also solltest du auch bereit sein, dafür entsprechend viel Zeit zu investieren. Je mehr Mühe du dir gibst, desto leichter machst du es anderen, dir zu helfen, und desto wahrscheinlicher ist es, dass jemand sich auch wirklich mit deinem Problem beschäftigt.


Danke!

Ich würde noch ändern (ich möchte nicht direkt in deinem Beitrag rumpfuschen):
- Bei Fehlermeldungen ist die erste Meldung die wichtigste, alles danach kann ein Folgefehler sein.
- Man sollte versuchen Fehlermeldungen wenigstens so weit zu verstehen, dass man die ganze erste Fehlermeldung hier postet. Wie du schon erwähnt hast, tritt das sehr oft bei Templates auf, aber hier wurden auch schon sehr oft andere Fehlermeldungen nach der ersten Zeile abgeschnitten, weil die Leute kein Englisch können (oder eher, weil sie gar nicht erst versuchen, die Meldung zu verstehen)
- Warnoptionen erwähnen. Viele typische Laufzeitfehler (besonders wenn man eher C als C++ macht) und sogar manche Compiler- und Linkerfehler können durch Beachten von Warnungen abgeschaltet werden.
- Linkerfehler haben (zumindest beim GCC) auch eine Angabe der Quelldatei mit einer kryptischen Positionsangabe. Das könnte in deinem Text missverstanden werden. Das sieht dann beispielsweise so aus:
Code:
example.cpp:(.text._ZN9igzstreamD1Ev[_ZN9igzstreamD1Ev]+0x67): undefined reference to `gzstreambase::~gzstreambase()'

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von pumuckl am 06:04:28 04.06.2012, insgesamt 2-mal bearbeitet
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 14:44:39 30.05.2012   Titel:              Zitieren

SeppJ schrieb:
Ich würde noch ändern (ich möchte nicht direkt in deinem Beitrag rumpfuschen):
Danke fürs Feedback, darf gerne ergänzt werden :)

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3232
Beitrag Sone Mitglied 20:19:11 30.05.2012   Titel:   Re: Den richtigen Code posten: reduziertes compilierbares Beispiel            Zitieren

pumuckl schrieb:

[*]Ersetze #includes von eigenen Headern durch den Inhalt der Header, so dass du weniger Dateien bekommst.


Meinst du das ernst?
Unregistrierter





Beitrag Unregistrierter 20:29:54 30.05.2012   Titel:   Re: Den richtigen Code posten: reduziertes compilierbares Beispiel            Zitieren

Hacker schrieb:
pumuckl schrieb:

[*]Ersetze #includes von eigenen Headern durch den Inhalt der Header, so dass du weniger Dateien bekommst.


Meinst du das ernst?
Ja natürlich. pumuckl will darauf hinaus, dass ein Post im besten Fall genau 1 C/C++ Tag enthält, in dem sich ein kompilierbares Minimalbeispiel befindet.
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3232
Beitrag Sone Mitglied 20:32:43 30.05.2012   Titel:   Re: Den richtigen Code posten: reduziertes compilierbares Beispiel            Zitieren

Gugelmoser schrieb:
Hacker schrieb:
pumuckl schrieb:

[*]Ersetze #includes von eigenen Headern durch den Inhalt der Header, so dass du weniger Dateien bekommst.


Meinst du das ernst?
Ja natürlich. pumuckl will darauf hinaus, dass ein Post im besten Fall genau 1 C/C++ Tag enthält, in dem sich ein kompilierbares Minimalbeispiel befindet.


Ich dachte er meint es allgemein bezogen :shame-on-me:

Ich kann aber auch noch beitragen: Mann soll umbedingt C&P verwenden, sonst wird oft Verwirrung gestiftet.


Zuletzt bearbeitet von Sone am 20:35:55 30.05.2012, insgesamt 1-mal bearbeitet
Unregistrierter





Beitrag Unregistrierter 20:42:01 30.05.2012   Titel:   Re: Den richtigen Code posten: reduziertes compilierbares Beispiel            Zitieren

Hacker schrieb:
Ich kann aber auch noch beitragen: Mann soll umbedingt C&P verwenden, sonst wird oft Verwirrung gestiftet.
Und wie viele Neulinge wissen was C&P heißt?... googlen dann und finden "C+P Möbelsysteme - Möbel für Menschen". Schreib es bitte aus. ;)


Zuletzt bearbeitet von Unregistrierter am 20:53:45 30.05.2012, insgesamt 1-mal bearbeitet
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3232
Beitrag Sone Mitglied 22:23:39 30.05.2012   Titel:   Re: Den richtigen Code posten: reduziertes compilierbares Beispiel            Zitieren

Gugelmoser schrieb:
Hacker schrieb:
Ich kann aber auch noch beitragen: Mann soll umbedingt C&P verwenden, sonst wird oft Verwirrung gestiftet.
Und wie viele Neulinge wissen was C&P heißt?... googlen dann und finden "C+P Möbelsysteme - Möbel für Menschen". Schreib es bitte aus. ;)


Hahaha :D

Das Problem bei nicht Copy&Paste ist, dass dann Leute kommen und sich beschweren mit Beiträgen wie: Das lässt sich gar nicht compilieren, schlechtes Codebeispiel, blablabla. Damit schweift man ab. Den Code allerdings direkt zu kopieren ist besser. Dann kann man Flüchtigkeitsfehler sowie ein vergessenes Semikolon schneller abhaken.


Zuletzt bearbeitet von Sone am 22:23:57 30.05.2012, insgesamt 1-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16054
Beitrag hustbaer Mitglied 23:59:44 30.05.2012   Titel:              Zitieren

@pumuckl
1 for effort :live:

Dummerweise aber tl;dr
Und vermutlich auch tl;dr für die Leute an die es gerichtet ist :(

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3232
Beitrag Sone Mitglied 07:15:17 31.05.2012   Titel:              Zitieren

hustbaer schrieb:

Dummerweise aber tl;dr
Und vermutlich auch tl;dr für die Leute an die es gerichtet ist :(


Was!? Das geht doch noch voll klar. Im Gegensatz zu anderem...
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 09:30:21 31.05.2012   Titel:              Zitieren

@Hacker: C&P ist eingebaut (ausgeschrieben...) #include ersetzen ist tatsächlich beabsichtigt, bei der Reduzierung. Header sollten nach dem Rauswurf überflüssiger Funktionen eh nurnoch ein paar Zeilen lang sein.

@hustbaer: Dass es wenige vor ihrem ersten Post lesen werden ist mir bewusst. Denen die zu faul sind ist aber so oder so nicht zu helfen. Ich habs nur einmal sauber hinschreiben wollen, weil ein Link darauf einfacher zu posten ist als jedesmal zu erklären, was mit minimalem kompilierbarem Beispiel gemeint ist.

Allmählich sind unsere wichtig-Threads aussagekräftig genug dass man einfach schreiben kann "du liest unseres nicht, warum sollten wir dann deins lesen".

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
c++.de :: C++ (auch C++0x und C++11) ::  Diskussion über "Den richtigen Code posten: reduziertes compilierbares Beispiel"  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.