[C/C++] const auf integrale typen in einer Funktion sinnvoll?
-
;fricky schrieb:
Nexus schrieb:
C++ hat eben den Vorteil, dass man genauso Low-Level arbeiten kann, und zwar ohne Einschränkungen.
doch mit einschränkungen: http://www.mikrocontroller.net/articles/C_vs_C-Plusplus
Der Link war wohl ein Eigentor, zumindest sehe ich hier keinen einzigen Nachteil von C++ gegenüber C. In allen aufgezählten Punkten ging C++ als Sieger hervor in Bezug darauf, dass es Funktionalität liefert die man in C händisch nachbauen muss oder gar nicht hat. Und was ganz wichtig ist: wenn man sie nicht benutzt, dann kosten sie nichts.
-
;fricky schrieb:
klar können konvertierungen auch schon selber abschmieren.
EPIC fail.
reinterpret_cast kann nicht abschmieren.gib dir bitte mühe beim trollen, mittlerweile kann meine oma deine "argumente" widerlegen... uU vl mal mit der materie befassen...?
-
Shade Of Mine schrieb:
reinterpret_cast kann nicht abschmieren.
cast in einen Typ, für den der Operand nicht hinreichend ausgerichtet ist?
-
camper schrieb:
Shade Of Mine schrieb:
reinterpret_cast kann nicht abschmieren.
cast in einen Typ, für den der Operand nicht hinreichend ausgerichtet ist?
Dann schmiert der Zugriff ab, oder?
-
Shade Of Mine schrieb:
reinterpret_cast kann nicht abschmieren.
probier dies:
int a = 0; puts ("hallo-1"); int &b = *reinterpret_cast<int*>(a); // hier puts ("hallo-2"); char *c = reinterpret_cast<char*>(b); // oder hier puts ("hallo-3");
-
Shade Of Mine schrieb:
camper schrieb:
Shade Of Mine schrieb:
reinterpret_cast kann nicht abschmieren.
cast in einen Typ, für den der Operand nicht hinreichend ausgerichtet ist?
Dann schmiert der Zugriff ab, oder?
Der Standard ist hier etwas mehrdeutig formuliert.
5.2.10/7
A pointer to an object can be explicitly converted to a pointer to an object of different type.65) Except that converting an rvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer value, the result of such a pointer conversion is unspecified.Beschränkt die in Klammern genannte Bedingung nur die Gleichheit der Konvertierungskette T1*->T2*->T1* oder ist die ausreichende Ausrichtung eine Voraussetzung, damit die Konvertierung überhaupt ein definiertes Ergebnis hat?
C90 schrieb:
6.3.4
...
A pointer to an object or incomplete type may be converted to a pointer to a different object type or a different incomplete type. The resulting pointer might not be valid if it is improperly aligned for the type pointed to. It is guaranteed, however, that a pointer to an object of a given alignment may be converted to apointer to an object of the same alignmet or a less strict alignmet and back again: the result shall compare equal to the original pointer.Was ein "invalid pointer" sein soll, ist wahrscheinlich nirgendwo definiert.
C99 schrieb:
6.3.2.3
7 A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned57) for the pointed-to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer. When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.wenigstens diese Formulierung ist eindeutig - fraglich nur, ob man sie übertragen darf...
-
;fricky schrieb:
probier dies:
epic fail.
reinterpret_cast schmiert nicht ab. der zugriff danach schmiert ab.
-
Shade Of Mine schrieb:
reinterpret_cast schmiert nicht ab. der zugriff danach schmiert ab.
es wird doch nirgends zugegriffen, nur umgewandelt.
-
;fricky schrieb:
es wird doch nirgends zugegriffen, nur umgewandelt.
Dann lern mal c++
int &b = *reinterpret_cast<int*>(a);
ich sehe hier eine dereferenzierung des gecasteten wertes.char *c = reinterpret_cast<char*>(b);
ich sehe hier einen zugriff auf das gecastete objekt von vorher.
-
;fricky schrieb:
Shade Of Mine schrieb:
reinterpret_cast schmiert nicht ab. der zugriff danach schmiert ab.
es wird doch nirgends zugegriffen, nur umgewandelt.
Siehst du, du solltest wirklich einmal die Syntax und Semantik von C++ lernen, bevor du argumentieren willst. Wenn du in C++ programmierst, wie oben, dann präsentierst du das typische Bild eines Fricklers, der einfach so lange rumhackt bis der Compiler irgendwie das gewünschte ausspuckt. Mit einem sauberen C++ Programm hat das nichts gemeinsam.
-
Shade Of Mine schrieb:
int &b = *reinterpret_cast<int*>(a);
ich sehe hier eine dereferenzierung des gecasteten wertes.char *c = reinterpret_cast<char*>(b);
ich sehe hier einen zugriff auf das gecastete objekt von vorher.b ist eine referenz, a muss nicht dereferenziert werden weil int& und int* äquivalent sind. selbiges bei b nach c, umwandlung von referenz in zeiger.
hast du es ausprobiert? wo stürzt es bei dir ab? eigentlich sollte nichts passieren.
-
;fricky schrieb:
b ist eine referenz, a muss nicht dereferenziert werden weil int& und int* äquivalent sind. selbiges bei b nach c, umwandlung von referenz in zeiger.
hast du es ausprobiert? wo stürzt es bei dir ab? eigentlich sollte nichts passieren.
Grundlagen lernen fricky.
Natürlich sollte etwas passieren.
Bei der 1. dereferenzierung wird nichts passieren, da eine referenz intern ein zeiger ist, bei der dereferenzierung in dem 2. cast macht es aber peng, da ein null zeiger dereferenziert wird.oh wunder.
kann ich dir ohne testen sagen.
du hast in jedem reinterpret_cast nunmal einen zugriff auf einen gecasteten wert. und das funktioniert nicht. der zugriff schmiert ab, nicht der cast.
ist auch leicht testbar:
int a = 0; puts("hallo-1"); int* b = reinterpret_cast<int*>(a); puts("hallo-2"); int& b2=*b; puts("hallo-3"); int b3=b2; puts("hallo-4"); char *c = reinterpret_cast<char*>(b3); puts("hallo-5");
und schon schmiert es bei der zuweisung
int b3=b2;
ab.keine magie, keine hexerei.
-
Shade Of Mine schrieb:
Bei der 1. dereferenzierung wird nichts passieren, da eine referenz intern ein zeiger ist, bei der dereferenzierung in dem 2. cast macht es aber peng, da ein null zeiger dereferenziert wird.
wieso findet im zweiten cast eine dereferenzierung statt? ich wandle eine referenz in einen pointer um, wo ist der unterschied zum ersten cast, der dasselbe nur umgekehrt macht und von dem du oben noch gesagt hast, dass er auch abschmieren würde?
-
bitte halt einfach das maul fricky
-
;fricky schrieb:
wieso findet im zweiten cast eine dereferenzierung statt? ich wandle eine referenz in einen pointer um, wo ist der unterschied zum ersten cast, der dasselbe nur umgekehrt macht und von dem du oben noch gesagt hast, dass er auch abschmieren würde?
Anfänger. Die Referenz ist ein Abstraktes Ding. das gibt es gar nicht. Du greifst auf das Originalobjekt zu.
//edit da Unklar:
char *c = reinterpret_cast<char*>(b3);
Ist kein cast int&->char* sondern von int->char*
-
otze schrieb:
Anfänger. Die Referenz ist ein Abstraktes Ding. das gibt es gar nicht. Du greifst auf das Originalobjekt zu.
oh stimmt, im zweiten cast hätte ja noch ein & hingemusst. mein fehler. ich muss zugeben: meine letzten experimente mit c++ liegen schon etwas zurück.
-
;fricky schrieb:
otze schrieb:
Anfänger. Die Referenz ist ein Abstraktes Ding. das gibt es gar nicht. Du greifst auf das Originalobjekt zu.
oh stimmt, im zweiten cast hätte ja noch ein & hingemusst. mein fehler. ich muss zugeben: meine letzten experimente mit c++ liegen schon etwas zurück.
Ich sage ja, einfach einmal mit der Materie befassen bevor man trollt, das wirkt dann besser.
-
Shade Of Mine schrieb:
;fricky schrieb:
otze schrieb:
Anfänger. Die Referenz ist ein Abstraktes Ding. das gibt es gar nicht. Du greifst auf das Originalobjekt zu.
oh stimmt, im zweiten cast hätte ja noch ein & hingemusst. mein fehler. ich muss zugeben: meine letzten experimente mit c++ liegen schon etwas zurück.
Ich sage ja, einfach einmal mit der Materie befassen bevor man trollt, das wirkt dann besser.
ach nö, für meine belange reicht der blick aus der vogelperspektive. wieso sollte ich auch 'nen 'schwarzen gürtel' in der cpp-programmierung anstreben, wenn ich c++ voraussichtlich nie verwenden werde? bisherige versuche liegen, wie gesagt, schon eine weile zurück und nur die albtraumhaftesten erlebnisse haben sich bei mir eingeprägt. für mich reicht es aus, c++ code lesen zu können. und ob da irgendwo ein reinterpret_cast oder c-cast auftaucht, ist dabei völlig gleich. ausserdem hast selbst du, als meister des fachs, im ersten cast eine dereferenzierung gesehen, so dass ich mich, als c++-noob, dafür nicht schämen muss.
-
;fricky schrieb:
ach nö, für meine belange reicht der blick aus der vogelperspektive. wieso sollte ich auch 'nen 'schwarzen gürtel' in der cpp-programmierung anstreben, wenn ich c++ voraussichtlich nie verwenden werde?
Die Frage ist nicht warum du C++ lernen sollst, sondern warum du über C++ sprichst wenn du keine Ahnung davon hast.
Fast jeder deiner Posts zeigt dass du die Grundlagen nicht verstanden hast, natürlich kommt dir C++ dann komisch vor. Mir kommt zB japanisch auch komisch vor und ich kann mir nicht vorstellen dass man mit dieser Schrift vernünftig arbeiten kann... Aber ich poste nicht dauernd wie dumm Japanisch ist
bisherige versuche liegen, wie gesagt, schon eine weile zurück und nur die albtraumhaftesten erlebnisse haben sich bei mir eingeprägt.
Weil du vermutlich alles falsch gemacht hast.
für mich reicht es aus, c++ code lesen zu können. und ob da irgendwo ein reinterpret_cast oder c-cast auftaucht, ist dabei völlig gleich. ausserdem hast selbst du, als meister des fachs, im ersten cast eine dereferenzierung gesehen, so dass ich mich, als c++-noob, dafür nicht schämen muss.
Da ist eine dereferenzierung.
****reinterpret_cast<int>(a);
Der erste * ist ein derferentierungs operator.
Solltest du aus C her kennen.
Der cast entspricht einem
(int)a;
in C.
-
Shade Of Mine schrieb:
Fast jeder deiner Posts zeigt dass du die Grundlagen nicht verstanden hast, natürlich kommt dir C++ dann komisch vor.
in der tat, jedesmal wenn ich versuche, etwas davon zu verstehen kommt es mir extrem komisch vor. aber ok, ich bin vielleicht auch etwas zu verwöhnt.
Shade Of Mine schrieb:
für mich reicht es aus, c++ code lesen zu können. und ob da irgendwo ein reinterpret_cast oder c-cast auftaucht, ist dabei völlig gleich. ausserdem hast selbst du, als meister des fachs, im ersten cast eine dereferenzierung gesehen, so dass ich mich, als c++-noob, dafür nicht schämen muss.
Da ist eine dereferenzierung.
****reinterpret_cast<int>(a);
Der erste * ist ein derferentierungs operator.aber wieso stürtzt er nicht schon da ab? schliesslich ist a null. würde er in der zeile a dereferenzieren, dann käme er nicht mehr zum zweiten cast, was er aber schafft (bei mir jedenfalls).