Zum Inhalt springen

locale facet und Streams (C++)


Empfohlene Beiträge

Hallo mal wieder. ;)

Ich habe heute mal ein Problem mit einem ostream.

Eine Funktion in einer kleinen DLL soll von der Anwendung einen Stream bekommen, und darauf schreiben.

[COLOR=green]// In der DLL[/COLOR] 

void Klasse::Meine Funktion(std::ostream& os)

{

  os << 1.5 << std::endl;

}
nun rufe ich aus der Anwendung die Funktion mit cout
[COLOR=green]// In der Anwendung[/COLOR] 

kl.MeineFunktion(std::cout);

Dabei wird eine Exception geworfen: "missing locale facet"

Komischerweise entsteht der Fehler nur, wenn Ich in der Funktion einen Zahlwert ausgeben möchte, auf den Stream, den ich ihm übergeben habe. Der Fehler entsteht nicht, wenn ich in derselben Funktion direkt auf std::cout schreibe, oder wenn ich die Funktion aus der Klasse löse und sie global in die Anwendung bette.

Was habe ich vergessen - liegt es an der DLL und der Parameterübergabe?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von FighterFigger

Was habe ich vergessen - liegt es an der DLL und der Parameterübergabe?

Ich tippe auf die Laufzeitbibliothek. Falls du die DLL und das Programm mit unterschiedlichen oder statischen Versionen der Laufzeitbibliothek verlinkst, versuch mal, die Runtime bei beiden auf "Multithreaded DLL" oder "Multithreaded Debug DLL" zu setzen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein - sorry.

Das ist es nicht.

Meine Anwendung ist SingleThreaded (debug) und meine DLLs alle MultiThreaded(debug).

Verwirrend ist für mich eben, daß ich aus der besagten Funktion heraus mühelos direkt in cout schreiben kann. Nur wenn ich cout als ostream übergebe entsteht der Fehler während der Laufzeit. Und das eben auch nur, wenn die Funktion dort in der DLL liegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von FighterFigger

Nein - sorry.

Das ist es nicht.

Meine Anwendung ist SingleThreaded (debug) und meine DLLs alle MultiThreaded(debug).

Und genau das ist ein Problem, denn damit hast du mehr als eine Laufzeitumgung in deinem Programm. Die Folge davon ist, dass statische/globale Objekte der Laufzeitumgebung mehrfach vorhanden sind.

Es könnte so sein, dass ein globales Default-facet-Objekt der Laufzeitumgebung der Anwendung initialisert wird, dann aber das (uninitialiserte) der Laufzeitumgebung der DLL verwendet wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja - wenn alle DLLs MultiThreadedDLL(debug) sind, hilft das auch nicht. Auch, wenn ich sogar die Anwendung MultiThreaded mache.

DLLs aber SingleThreaded zu machen, ist eine dumme Idee (oder?) ...

Dann muß ich also locale facet selber setzen, wie auch immer das geht ... oder die Doubles, um die es mir geht, selbständig vorher in Strings umwandeln ...

:( ... oder gibt es noch eine Alternative?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von FighterFigger

Naja - wenn alle DLLs MultiThreadedDLL(debug) sind, hilft das auch nicht. Auch, wenn ich sogar die Anwendung MultiThreaded mache.

Hast du auch die Anwendung auf MultiThreadedDLL(debug) gesetzt? Alle Komponenten, als Anwendung und DLLs, sollten die gleiche Runtime verwenden.
Link zu diesem Kommentar
Auf anderen Seiten teilen

ungelogen Klotzkopp ... ich bewundere dich von Thread zu Thread mehr. :)

Es hat geklappt, und ich habe eines gelernt: "FF, ließ dir mal genau durch, was du da alles eingestellt hast!"

Ich dachte, eine Anwendung würde mit der Laufzeitumgebung einer MultiThreadedDLL nix anfangen, weil sie keine DLL ist.

Typisches Beispiel von "Prinzip nicht verstanden" ...

Danke ... und wieder rein in den Code ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...