C/C++
-
-fricky- schrieb:
probier dies:
#include <iostream> using namespace std; volatile int *i = (volatile int*)123; int main() { printf ("%d\n", i); // OK cout << i << endl; // huch? }
Typfehler/Formatfehler bei der printf Funktion.
-
warning C4800: 'volatile int *': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)
-
-fricky- schrieb:
printf ("%d\n", i);
perfektes beispiel warum printf böse ist.
-
Sowohl C als auch C++ haben verloren in diesem Beispiel
-
~john schrieb:
Typfehler/Formatfehler bei der printf Funktion.
bei printf wäre %p richtig, aber da zeigt er eine hexzahl an. ich wollte aber die '123' haben. aber printf macht keine '1' daraus. das schafft nur 'cout'.
-
Zeus schrieb:
warning C4800: 'volatile int *': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)
sowas das ist aber nicht in ordnung. seit wann darf ein compiler meinen code auslegen, wie's ihm in den kram passt? zumal da ein fetter cast drin ist.
-
-fricky- schrieb:
~john schrieb:
Typfehler/Formatfehler bei der printf Funktion.
bei printf wäre %p richtig, aber da zeigt er eine hexzahl an. ich wollte aber die '123' haben. aber printf macht keine '1' daraus. das schafft nur 'cout'.
Tja, die klugen Leute erkennen damit das Problem - die unklugen wohl nicht.
In der Tat liegt das Problem darin, dass du einfach etwas falsches machst: die Adresse einer Variablen bekommt man über %p in printf und cast nach void* in cout.Einfach korrekten Code schreiben und es geht.
-
Nein, cout hat kein <<(volatile int *), deswegen wird der nächst passende genommen und impilizit konventiert.
-
Shade Of Mine schrieb:
die Adresse einer Variablen bekommt man über %p in printf und cast nach void* in cout.
ohne das 'volatile' kann cout die adresse aber ausgeben.
Zeus schrieb:
Nein, cout hat kein <<(volatile int *), deswegen wird der nächst passende genommen und impilizit konventiert.
wäre nicht ein fehler beim compilieren sinnvoller, als einfach das 'nächst passende' zu nehmen? vor allem passt das, angeblich nächste passende, überhaupt nicht.
-
-fricky- schrieb:
wäre nicht ein fehler beim compilieren sinnvoller, als einfach das 'nächst passende' zu nehmen? vor allem passt das, angeblich nächste passende, überhaupt nicht.
ja, aber printf macht es genauso.
nur dass printf dabei abstürtzen kann und cout halt warnt dass es nicht weiss was du von ihm willst.
-
Shade Of Mine schrieb:
nur dass printf dabei abstürtzen kann und cout halt warnt dass es nicht weiss was du von ihm willst.
naja, bei printf kommt auch ein warning. und zwar ein ziemlich unmissverständliches:
'%d' in format string conflicts with argument 1 of type 'volatile int *
während die warnung beim 'cout':
forcing value to bool 'true' or 'false' (performance warning)
doch erstmal zum nachdenken anregt (lenkt z.b. vom eigentlichen problem ab durch den hinweis, dass die performance leiden könnte). abstürzen würden sie wohl beide, auf einem system, auf dem ein missratener lesezugriff solche auswirkungen hätte. mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
-
-fricky- schrieb:
mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
Nur, dass dies kein Bug ist! Eine Konvertierung volatile int* => void* ist aus gutem Grund verboten. Wäre sie erlaubt, dann würde sie auch bevorzugt werden. Ich bin mir ganz und gar nicht sicher ob
printf("%p", (volatile int*)123);
überhaupt legaler Code ist. Bei der Übergabe dürfte eine Konvertierung volatile int* => volatile void* stattfinden. In printf wird bei va_arg jedoch void* benutzt. Ich glaube nicht, dass va_arg vom übergebenen Typ abweichen darf.
-
cout versagt also wenn Machiavelli, err... -fricky- am Werk ist?
Interessiert mich das?
eher nicht.
-
-fricky- schrieb:
forcing value to bool 'true' or 'false' (performance warning)
doch erstmal zum nachdenken anregt (lenkt z.b. vom eigentlichen problem ab durch den hinweis, dass die performance leiden könnte). abstürzen würden sie wohl beide, auf einem system, auf dem ein missratener lesezugriff solche auswirkungen hätte. mich erschüttert nur etwas diese konvertierung in ein 'boolean' und das damit verbundene 'aus 123 mach 1'. das könnte man schon als handfesten bug bezeichnen, der übrigens schon seit jahren drin ist. nur dass der alte MSVC dabei keinerlei warnung ausspuckte.
Offensichtlich denkst du nicht nach, sondern willst nur trollen. Wenn irgendetwas am cout Fall zum Absturz führen könnte, dann die unsägliche Initialisierung des Zeigers, die du verbrochen hast.
-
Ben04 schrieb:
Nur, dass dies kein Bug ist! Eine Konvertierung volatile int* => void* ist aus gutem Grund verboten. Wäre sie erlaubt, dann würde sie auch bevorzugt werden.
warum? an der breite des zeigers ändert es nichts. nur dass das 'volatile' dabei verschwindet, könnte in seltenen fällen problematisch sein. wie gesagt: ich hätte nichts dagegen, wenn der compiler die konvertierung für 'cout' nicht akzeptiert und den compiliervorgang abbrechen würde. aber einen 'bool' daraus zu machen ist doch einfach nur mist.
camper schrieb:
cout versagt also wenn Machiavelli, err... -fricky- am Werk ist?
bei dir verhält sich cout besser? das glaube ich eher nicht. oder benutzt du 'ne eigene implementierung?
camper schrieb:
Interessiert mich das?
mich interessierts, ehrlich gesagt, auch nicht, wie kaputt 'cout' ist. ich benutze es nie. ich wollte nur mal auf den fehler hinweisen, weil mal wieder jemand meinte, dass cout ein guter ersatz für 'printf' wäre.
-
cout konvertiert wenigstens irgendwas. printf macht es einfach nur falsch.
-
-fricky- schrieb:
warum? an der breite des zeigers ändert es nichts. nur dass das 'volatile' dabei verschwindet, könnte in seltenen fällen problematisch sein. wie gesagt: ich hätte nichts dagegen, wenn der compiler die konvertierung für 'cout' nicht akzeptiert und den compiliervorgang abbrechen würde. aber einen 'bool' daraus zu machen ist doch einfach nur mist.
Also lieber abstürtzen als warnen.
ja, das macht sinn.wenn deine trollerei wenigstens nur annäherend sinnvoll wäre. es gibt soviele sachen wo man bei c++ trollen könnte, aber du findest sie nie. furchtbar
-
LordJaxom schrieb:
cout konvertiert wenigstens irgendwas. printf macht es einfach nur falsch.
printf ist dumm und macht nur, was ihm befohlen wird. cout versucht schlau zu sein und versagt bei 'volatile int*' völlig. da ist mir printf auf jeden fall sympathischer als cout. printf macht von sich aus keine fehler. der programmierer muss die fehler schon selber machen.
Shade Of Mine schrieb:
Also lieber abstürtzen als warnen.
ja, das macht sinn.ist dir vielleicht entgangen, dass die printf-version auch warnings erzeugt?
übrigens, zum dritten mal: ich bin für 'lieber compilierung abbrechen als quatsch machen'. und nicht für abstürze.Shade Of Mine schrieb:
es gibt soviele sachen wo man bei c++ trollen könnte...
das wollen wir jetzt aber nicht. z.zt. geht es um das angeknackste 'cout' und nicht mal wieder c++ gegen den rest der welt.
-
-fricky schrieb:
camper schrieb:
cout versagt also wenn Machiavelli, err... -fricky- am Werk ist?
bei dir verhält sich cout besser? das glaube ich eher nicht. oder benutzt du 'ne eigene implementierung?
camper schrieb:
Interessiert mich das?
mich interessierts, ehrlich gesagt, auch nicht, wie kaputt 'cout' ist. ich benutze es nie. ich wollte nur mal auf den fehler hinweisen, weil mal wieder jemand meinte, dass cout ein guter ersatz für 'printf' wäre.
Es geht nicht darum wie kaputt cout deiner Meinung nach ist. camper wollte damit ausdrücken dass die Unterschiede zwischen printf und cout recht uninteressant sind, solang es nur darum geht wie der jeweilige verzweifelte Reaktionsversuch auf derartige Misshandlungen jenseits jeder Vernunft aussieht. Schließlich vergleicht man auch nicht zwei Sportwagen indem man sich damit auseinandersetzt mit welchem man besser die Heumaschine übern Acker ziehen kann.
-
Gut, cout hat ein theoretisches Problem. Aber jetzt mal ehrlich: Wann braucht ihr volatile? Wann wollt ihr den Inhalt eines volatile Zeigers als Zeichenfolge auf die Konsole ausgeben? Letzteres ergibt noch Sinn, wenn man einen Debugger schreiben würde, aber sonst?