Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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.

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.

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.

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?

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.

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 ...

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.