Problem mit vsprintf()
-
Hi,
ja ich gebe zu es ist C++ mit drin. Und ich gebe zu, dass das mit static falsch war. Aber beenden wir bitte das static-Thema; das static habe ich ja schon herausgenommen.
Aber der Fehler besteht nachwievor (nämlich, dass der int als 0 angezeigt wird).
Hat jemand eine Idee was der Fehler sein könnte?
Danke für jede Hilfe!Gruß,
Johannes
-
voidpointer schrieb:
Aber der Fehler besteht nachwievor (nämlich, dass der int als 0 angezeigt wird).
Hat jemand eine Idee was der Fehler sein könnte?
Danke für jede Hilfe!Da du ziemlich hilflos mit den Threads zu sein scheinst, ist die starke Vermutung, dass du da noch mehr Dummheiten gemacht hast. Aus Versehen oder aus falschverstandenen Optimierungswünschen (static zur Beschleunigung? Wo nimmt man solche Vorstellungen her?). Ohne Code kann man nicht mehr sagen. Schrumpf dein Programm soweit wie möglich zusammen, so dass es gerade noch den Fehler enthält und wir das Problem nachvollziehen können. Außerdem mach Mutexe um deine Ausgabe. Du willst ja sicherlich sowieso nicht, dass wenn zwei Threads "Hallo" und "Welt" schreiben "HaWlellot" rauskommt, also täte das der Ausgabe insgesamt gut. Und mach deine Optimierungsspielereien raus. Du scheinst da irgendwelche eigenen komischen Vorstellungen entwickelt zu haben oder hast eine gaaaannnz schlechte Quelle. static optimiert nichts sondern sagt was über Sichtbarkeit und Speicherbereiche. const ist keine Optimierung sondern ein Schutz vor eigenen Fehlern, unnötige consts an Stellen wo sie keine Fehler verhindern können, deuten da drauf hin, dass dir dies nicht klar ist. Vermutlich hast du daher noch mehr solche Hauer drin.
Und auch in C++ sind Threads keine richtigen Objekte. (Eigentlich in keiner Sprache die ich kenne)
-
Hi,
ich kenne const und so schlimmer Optimierungsfreak bin ich jetzt auch nicht. Ich finde es nur sauberer.
Zum Problem: Es war nichts mit Threads. Hier ist der Fehler:
out("long long int: %ldd, int: %d", longLongIntVar, intVar);
schlägt fehl, die 2te Variable ist 0. Richtig ist:
out("long long int: %lld, int: %d", longLongIntVar, intVar);
Das funktioniert dann auch
Wohl ein Speicherzugriffsfehler.
Abschließende Frage (wenn vllt auch nicht ANSI): Kann ich meinem Compiler (g++ 4.6) sagen, dass er einen formatString-Check machen soll? Damit sowas nie wieder passiert...
-
voidpointer schrieb:
Zum Problem: Es war nichts mit Threads.
Keine Sorge, das kommt noch, zumindest solange du dich nicht mal ein bisschen damit beschäftigst.
voidpointer schrieb:
Hier ist der Fehler:
Deswegen kopiert man nach Möglichkeit auch seinen Code, und postet nicht einfach irgendetwas.
voidpointer schrieb:
Damit sowas nie wieder passiert...
Wenn du eh C++ benutzt, wie wäre es dann mit einem sauberem operator << ?
-
cooky451 schrieb:
Wenn du eh C++ benutzt, wie wäre es dann mit einem sauberem operator << ?
Seine Anwendung ist doch performancekritisch. Dass C++ Streams total lahm sind, weiß doch jeder!
-
voidpointer schrieb:
Abschließende Frage (wenn vllt auch nicht ANSI): Kann ich meinem Compiler (g++ 4.6) sagen, dass er einen formatString-Check machen soll? Damit sowas nie wieder passiert...
Jain. Mit den Warnoptionen wird das schon gemacht, das funktioniert aber nur, wenn du den Formatstring direkt in der ausgabeanweisung stehen hast, nicht wenn der über drei Ecken an diese weitergereicht wird.
cooky451 schrieb:
voidpointer schrieb:
Hier ist der Fehler:
Deswegen kopiert man nach Möglichkeit auch seinen Code, und postet nicht einfach irgendetwas.
+1. Das hätten wir dir gleich sagen können, wenn du es nur gezeigt hättest.
Immerhin hast du so noch einen anderen, gefährlicheren Fehler gezeigt bekommen.
-
Naja der Grund, nicht cout zu Benutzen war nicht die Performance. Sicher eine interessante Frage, aber mein Problem ist, dass solche Sachen wie
cout << einStringMitBackslashN;
noch atomar auf meiner Konsole aussehen, aber
cout << einString << einInt << nochEinString;
manchmal durcheinander gewürfelt werden (zwischen den << Ops). Daher dachte ich, zuerst vsprintf und dann an cout.
-
Da passt als Antwort nur:
cooky451 schrieb:
voidpointer schrieb:
Zum Problem: Es war nichts mit Threads.
Keine Sorge, das kommt noch, zumindest solange du dich nicht mal ein bisschen damit beschäftigst.
Da haben wir's.
Und vorhin war's noch so extrem kritisch, dass du irgendwelche static-Tricks bei der Ausgabe machen wolltest (noch dazu über einen scheinbar unnötigen Umweg
) und nun ist es halb so wild?
-
voidpointer schrieb:
Daher dachte ich, zuerst vsprintf und dann an cout.
vsprintf funktioniert auch nur, weil du Glück hast. Du musst in jedem Fall irgendeinen threadsicheren Wrapper bauen. Bei operator << könntest du dann z.B. gesondert auf flush reagieren.
Aber um das noch mal zu betonen: Performancekritische Ausgabe auf der Konsole? Du machst etwas falsch! Die Ausgabe auf der Konsole ist so unglaublich langsam, wenn das performancekritisch ist, ist dein Programm wahrscheinlich 99% der Zeit am warten.
Was schreibst du denn da alles rein?
-
voidpointer schrieb:
Abschließende Frage (wenn vllt auch nicht ANSI): Kann ich meinem Compiler (g++ 4.6) sagen, dass er einen formatString-Check machen soll? Damit sowas nie wieder passiert...
Aktuelle gcc warnen hierbei, so wie gewünscht.
Beim C++ "<<" natürlicherweise nicht ebenso häufig.
-
Du könntest auch einfach C++0x aktivieren und ein typsicheres printf verwenden.