Home

Ninja-Segfault

Montag, 7. Februar 2011 | Autor:

Letzte Woche hatte ich einen Bug, der mich 4 Stun­den und die ent­spre­chende Menge Ner­ven gekos­tet hat. Der Ori­gi­nal­code ist ziem­lich undurch­sich­tig, des­we­gen habe ich eine kleine, kom­pi­lier­bare Demo geschrieben:

#include <vector>
#include <stack>

class Blubb
{
	public:
		std::vector<int> * liste;
		Blubb() {
			liste = new std::vector<int>(10);
		}
		~Blubb() {
			delete liste;
		}
};

int main()
{
	std::stack<Blubb> stapel;
	Blubb blip;
	stapel.push(blip);
	return 0;
}

Wer meint, C++ zu beherr­schen, darf jetzt grü­beln, warum die­ser Code einen Seg­fault wirft. Viel Spaß dabei! ;) wei­ter…

Thema: Sezierte C++-Käfer | 2 Kommentare

Das Semikolon aus einer anderen Welt

Dienstag, 25. Januar 2011 | Autor:

#include "../../math/src/FInterpolation.hh"

/** Interface class for seed lines such as lines, curves, polylines. */
class SeedCurve
{
	public:
		virtual FPosition ipol(double t) = 0;
		virtual vector<FPosition> getPositions(positive number_of_seeds) = 0;
};

gibt eine Fehlermeldung:

SeedLine.hh:9:1: error: multiple types in one declaration

Meh­rere Typen in einer Deklaration.

Der Aus­lö­ser für diese Mel­dung ist sim­pel, aber viel­leicht nicht offen­sicht­lich: Nach der Dekla­ra­tion eines neuen „Typs”, d.h. einer Klasse oder eines Structs, wurde das Semi­ko­lon ver­ges­sen - aller­dings nicht an der Stelle, die die Feh­ler­mel­dung nennt! ;) wei­ter…

Thema: Sezierte C++-Käfer | 2 Kommentare

Lange Fehlermeldung, kleine Ursache

Mittwoch, 19. Januar 2011 | Autor:

/home/nico/code/FAnToM/src/visAlgos/StreakSurface/FStreakSurfaceAlgorithm.cc: In member function ‘void FStreakSurfaceAlgorithm::DCELtest()’:
/home/nico/code/FAnToM/src/visAlgos/StreakSurface/FStreakSurfaceAlgorithm.cc:245:43: error: no match for ‘operator<<’ in ‘std::cout << ((DCEL::HalfEdge*)((DCEL::HalfEdge*)((boost::intrusive::detail::add_const_if_c::type*)x.boost::intrusive::list_iterator::operator* [with Container = boost::intrusive::list_impl, (boost::intrusive::link_mode_type)1u, boost::intrusive::default_tag, 1>, long unsigned int, true> >, bool IsConst = false, typename boost::intrusive::detail::add_const_if_c::type& = DCEL::HalfEdge&, typename boost::intrusive::detail::add_const_if_c::type = DCEL::HalfEdge]

wei­ter…

Thema: Sezierte C++-Käfer | 2 Kommentare

Constness of least Surprise

Donnerstag, 6. Januar 2011 | Autor:

Phy­sik­stu­dent Mar­tin K.1 hat mir wie­der einen net­ten klei­nen Bug zuge­tra­gen! Hier erst­mal der Codeausschnitt:

QList<qint32> countlist;
	//std::swap funktioniert nicht, daher manuelles tauschen
	int_swap = countlist.at(i);
	countlist.at(i) = countlist.at(j);
	countlist.at(j) = int_swap;
	string_swap = keylist.at(i);
	keylist.at(i) = keylist.at(j);
	keylist.at(j) = string_swap;

Und die Fehlermeldung:

wortliste.cpp: In function 'void quick_sort(QList<QString>, QList<int>)':
wortliste.cpp:49: error: assignment of read-only location 'countlist.QList<T>::at [with T = int](i)'
wortliste.cpp:50: error: assignment of read-only location 'countlist.QList<T>::at [with T = int](j)'
wortliste.cpp:52: error: passing 'const QString' as 'this' argument of 'QString& QString::operator=(const QString&)' discards qualifiers
wortliste.cpp:53: error: passing 'const QString' as 'this' argument of 'QString& QString::operator=(const QString&)' discards qualifiers

Viel­leicht mal ein paar Worte zum Lesen von Feh­ler­mel­dun­gen. wei­ter…

  1. Name nicht im Gerings­ten geän­dert.

Thema: Sezierte C++-Käfer | Beitrag kommentieren

no matching function call

Montag, 27. Dezember 2010 | Autor:

Ein neuer Tag, eine neue Fehlermeldung:

/home/nico/code/FAnToM/src/visAlgos/IntegralLines/../../math/src/ODESolver/StreakLine.hh:76:2: error: no matching function for call to ‘Tracer<2, (FLineType)0u>::Tracer(std::vector<MeshNode>, boost::shared_ptr<const FTimeDependentTensorField>&, FPosition&, double&, const double&, const double&, int)’
/home/nico/code/FAnToM/src/visAlgos/IntegralLines/../../math/src/ODESolver/Tracer.hh:392:3: note: candidates are:
[... (diverse Vorschläge ausgelassen)]
/home/nico/code/FAnToM/src/visAlgos/IntegralLines/../../math/src/ODESolver/Tracer.hh:886:1: note:                 Tracer<DIM, lineT>::Tracer(std::vector<MeshNode>&, Tracer<DIM, lineT>::Fieldtype, const FPosition&, double, double, double, unsigned int) [with int DIM = 2, FLineType lineT = (FLineType)0u, Tracer<DIM, lineT>::Fieldtype = boost::shared_ptr<const FTimeDependentTensorField>, FPosition = FArray]

Diese Mel­dung ist aus einem ganz bestimm­ten Grund fies, der aber nicht offen­sicht­lich ist. Die Mel­dung sug­ge­riert, man habe beim Funk­ti­ons­auf­ruf etwas falsch­ge­macht. Oft stimmt das auch und die Gründe sind dann solche:

  • Para­me­ter der Funk­tion vergessen
  • bei einem (oder meh­re­ren!) Para­me­tern den fal­schen Typ benutzt
  • const igno­riert
  • Tipp­feh­ler

Ich habe über­legt, was davon es sein könnte. Gegrü­belt und getes­tet. Man fängt ja nach ner Weile an, die unmög­lichs­ten Dinge zu ver­mu­ten. Zum Bei­spiel, dass es viel­leicht daran, dass ein Para­me­ter const oder eine Refe­rence ist? Habe ich Tem­pla­tes falsch benutzt? Gerade für Anfän­ger, die mit con­st­ness, Refe­ren­zen und Tem­pla­tes noch nicht so firm sind, der Super-Gau!

Aber auch mir ist es heute passiert.

Es lag daran, dass ich die Datei, in der die Funk­tion deklariert/definiert ist, nicht inclu­det habe.

Thema: Sezierte C++-Käfer | Beitrag kommentieren

Debugger - GDB

Montag, 22. November 2010 | Autor:

Debug­ger sind Pro­gramme, die einem bei der Feh­ler­su­che hel­fen sol­len. Mit einem Debug­ger kann man das Pro­gramm quasi bei der Arbeit beob­ach­ten: Wel­che Code­zeile wird als nächs­tes aus­ge­führt? Was ent­hält diese und jene Varia­ble momen­tan? Wie sieht der Call-Stack/Backtrace momen­tan aus? An wel­cher Stelle stürzt das Pro­gramm genau ab? und vie­les ande­res mehr.

Für C++ (und jede Menge ande­rer Spra­chen) gibt es den GNU-Debugger, kurz GDB. wei­ter…

Thema: Programmieren, Sezierte C++-Käfer | Beitrag kommentieren

Der Feind aller Arithmetik

Freitag, 22. Oktober 2010 | Autor:

Neu­lich bin ich auf einen Feh­ler gesto­ßen, der erst­mal so schlimm gar nicht aus­sieht:
interpolate(double, const P&, const P&) [with P = FVector]: Assertion `t >= 0.0 && t <= 1.0' failed.
Die Feh­ler­mel­dung sagt uns, dass eine Asser­tion fehl­ge­schla­gen ist. Offen­bar ist der Para­me­ter t nicht zwi­schen 0 und 1. Aber das ist noch längst nicht alles.. wei­ter…

Thema: Sezierte C++-Käfer | Beitrag kommentieren

An Hallo-Welt scheitern leicht gemacht

Sonntag, 1. August 2010 | Autor:

Nach­dem man seine ers­ten Pro­gramme geschrie­ben aus Bei­spiel­code aus dem Inter­net zusam­men­ge­stöp­selt hat, nimmt man sich beim nächs­ten Pro­gramm vor, alles von Hand zu schrei­ben - und zwar aus dem Kopf, jahaah! Abgu­cken kann schließ­lich jeder und so schwer kann es ja auch nicht sein, sich an die paar grund­le­gen­den Schlüs­sel­worte zu erin­nern. Wäre doch gelacht.

Das hat bei mir nie geklappt.

Mit jedem neuen Pro­gramm habe ich die sel­ben Feh­ler wie­der­holt und mir die dar­auf hin­wei­sen­den, kryp­ti­schen Feh­ler­mel­dun­gen nicht gemerkt. Des­we­gen hier ein klei­ner Walk­th­rough für C++ am Bei­spiel des all­seits belieb­ten Hallo-Welt. Viel­leicht hilft es auch via Google dem ein oder ande­ren Anfän­ger wei­ter. :) wei­ter…

Thema: Programmieren, Sezierte C++-Käfer | Beitrag kommentieren