operator>> für Vector-Klasse

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

operator>> für Vector-Klasse

Beitrag von Jonathan »

Ich habe grad wieder ein ganz dämliches Problem. War es nicht immer so, dass der standard istream-operator bis zum Leerzeichen ließt?

Code: Alles auswählen

std::istream& operator>> (std::istream& stream, glm::vec3& v)
{
	stream >> v.x;
	stream >> v.y;
	stream >> v.z;
	return stream;
}

boost::lexical_cast<vec3>("-6.929 5.7033 13.5175");
Er ließt das x ein, laut Debugger ist der Wert auch richtig, aber y und z bleiben auf 0 und dann krieg ich ne exception, dass der cast nicht funktioniert hat. Ich habe das Gefühl, irgendeine Kleinigkeit übersehen zu haben, komme gerade aber echt nicht drauf. (Zur Info: Es ist ein ASCII-String und das Leerzeichen ist richtig (32))
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von dot »

Und der stream ist nach der ersten Operation auch .good()? Hast du auch alle nötigen Header eingebunden?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Schrompf »

Mal reingesteppt, wo der Stream steht, wenn der erste float gelesen ist?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Jonathan »

So, hatte lange keine Zeit weiter zu machen:

Code: Alles auswählen

namespace std
{
	std::istream& operator>> (std::istream& stream, glm::vec3& v)
	{
		stream >> v.x;
		auto a = stream.good();
		stream >> v.y;
		auto b = stream.good();
		stream >> v.z;
		auto c = stream.good();
		return stream;
	}
}
x hat den richtigen Wert, y und z sind 0, a ist true und b und c sind false. Was der Grund dafür sein dürfte, dass boost::lexical_cast danach die Exception schmeißt...

Bezüglich Header: Es compiliert halt und die Funktion wird ja auch gefunden und aufgerufen, was könnte den da noch nicht stimmen?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Schrompf »

Nimm den Debugger und steppe rein.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Jonathan »

Mit F11 kann ich irgendwie nicht in die Stream-Operatoren steppen, die werden direkt ausgeführt. Egal:

Code: Alles auswählen

#include <cstdio>
#include <sstream>
#include <boost/lexical_cast.hpp>

using namespace std;


namespace glm
{
	struct vec3
	{
		float x, y, z;
	};
}

namespace std
{
	std::istream& operator>> (std::istream& stream, glm::vec3& v)
	{
		stream >> v.x;
		stream >> v.y;
		stream >> v.z;
		return stream;
	}
}

template <typename T>
T lexical_cast(const std::string& s)
{
	std::stringstream ss(s);

	T result;
	if((ss >> result).fail() || !(ss >> std::ws).eof())
	{
		throw std::bad_cast();
	}

	return result;
}


int main()
{
	stringstream a;
	a << "3 5 12";
	glm::vec3 v;
	a >> v;
	::lexical_cast<glm::vec3>("3 5 12");
	boost::lexical_cast<glm::vec3>("3 5 12");
}
Die ersten zwei Versionen funktionieren, die dritte nicht. Irgendetwas an boost::lexical_cast ist komisch, aber es ist halt auch ein verdammt komplexes Template, und irgendwie habe ich keine Lust, mir die ganzen Innereien anzuschauen.

Das ist jetzt sehr unbefriedigend: Ich könnte meinen eigenen lexical_cast benutzen, der scheint ja zu gehen, aber irgendwie will man sowas ja nicht. Meine boost-Installation (1.55 auf VS 12 Update 2) hat bisher jedenfalls sehr gut funktioniert, ich habe das Problem in zwei verschiedenen Projekten getestet, ich halte es für relativ unwahrscheinlich, dass ich in irgendwelchen Projektoptionen so viel falsch gemacht habe, dass der lexical_cast in diesem Fall (normale Zahlen gehen super) fehlschlägt. Keine Ahnung, was hier los ist...
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
xq
Establishment
Beiträge: 1582
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von xq »

Blöde Frage, aber kann man nicht einfach für die boost::lexical_cast ne spezialisierte template-implementierung für die GLM-Sachen machen?
Müsste doch eigentlich möglich sein oder überseh ich da was?

grüße
Felix
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Schrompf »

Klar kann man das machen. Aber es sollte auch so gehen. Das ist schon hinreichend seltsam. Ich sehe gar keinen Unterschied zwischen Version zwei und drei?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Jonathan »

MasterQ32 hat geschrieben:Blöde Frage, aber kann man nicht einfach für die boost::lexical_cast ne spezialisierte template-implementierung für die GLM-Sachen machen?
Müsste doch eigentlich möglich sein oder überseh ich da was?
Ja im Grunde würde das aber wieder darauf hinauslaufen, dass ich mir einen Stringstream nehme, die Eingabe reinschreibe und dann die einzelnen Zahlen auslese. Also im Grunde würde ich damit wieder boost::lexical_cast nachbauen.
Schrompf hat geschrieben:Klar kann man das machen. Aber es sollte auch so gehen. Das ist schon hinreichend seltsam. Ich sehe gar keinen Unterschied zwischen Version zwei und drei?
Ja, jede Erklärung, was boost::lexical_cast macht läuft eigentlich auf den Code von Fall 2 hinaus. Wenn man sich dann aber die tatsächliche Implementierung anschaut, sieht man, dass doch noch eine ganze Menge mehr dahinter stecken muss. Was genau der Sinn von all dem ist, weiß ich nicht, aber ich vermute, wenn es von C++ Experten geschrieben ist, wird es schon irgendwo Sinn machen. Was natürlich nicht heißen muss, dass nicht trotzdem noch ein Bug drin steckt.

Vielleicht poste ich das Beispielprogramm einfach mal auf der boost-Mailinglist.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: operator>> für Vector-Klasse

Beitrag von mnemonix »

Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: operator>> für Vector-Klasse

Beitrag von Jonathan »

Damit gehts, vielen Dank!
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten