void pointer Frage
-
ja, weil cast und dereference eine right-to-left associativity und das gleiche precedence level haben

edit: das mal schönes englisch deutsch kauderwelsch...
-
Ty für die Antworten.
Aber das Programm stürtzt nicht ab.
Den Quelltext hab ich aus dem C++ Primer.Das steht in dem C++ Primer zum void pointer:
Once you assign to a void* you lose any information about what type it is. This means that before you can use the pointer, you must cast it to the correct type: //: C03:CastFromVoidPointer.cpp int main() { int i = 99; 3: The C in C++ 155 void* vp = &i; // Can't dereference a void pointer: // *vp = 3; // Compile-time error // Must cast back to int before dereferencing: *((int*)vp) = 3; } ///:~ The cast (int*)vp takes the void* and tells the compiler to treat it as an int*, and thus it can be successfully dereferenced. You might observe that this syntax is ugly, and it is, but it’s worse than that – the void* introduces a hole in the language’s type system. That is, it allows, or even promotes, the treatment of one type as another type. In the example above, I treat an int as an int by casting vp to an int*, but there’s nothing that says I can’t cast it to a char* or double*, which would modify a different amount of storage that had been allocated for the int, possibly crashing the program. In general, void pointers should be avoided, and used only in rare special cases, the likes of which you won’t be ready to consider until significantly later in the book. You cannot have a void reference, for reasons that will be explained in Chapter 11.
-
void *ptr schrieb:
Aber das Programm stürtzt nicht ab.
Den Quelltext hab ich aus dem C++ Primer.Da steht ja auch
void* vp = &i;
und nicht
void *vp;
-
sagte doch das buch ist nicht zielführend...
-
no_code schrieb:
sagte doch das buch ist nicht zielführend...
In welchem Zusammenhang stellst du jetzt diese Behauptung auf?
-
findest du das buch nicht ein bichen zu umfangreich mit zuviel text und zuwenig infos?
-
http://www.cppreference.com/wiki/operator_precedence
Dieser Cast-Operator und der Dereference-Operator haben die gleiche Priorität (3).
Bei gleicher Priorität (3) ist die Abarbeitungsreihenfolge right-to-left.
D.h.: Es wird zuerst gecastet und dann dereferenziert.Und wie wxSkip bereits erwähnte, stürtzt das Programm, in dieser Art, in den meisten Fällen ab, und zwar einfach deswegen, da dein Pointer irgendwo hinzeigt, wo er gerade Bock drauf hat ... in deinem Fall hast du wohl Glück.
no_code schrieb:
sagte doch das buch ist nicht zielführend...
Augen auf, Mund zu :p ---> In dem Beispielcode des Primers zeigt der Pointer auf eine zuvor definierte Variable.
-
Dweb schrieb:
no_code schrieb:
sagte doch das buch ist nicht zielführend...
Augen auf, Mund zu :p ---> In dem Beispielcode des Primers zeigt der Pointer auf eine zuvor definierte Variable.
ich sagte auch nicht das buch sei falsch...
edit: naja wobei über die klammern kann man dann ja diskutieren
-
Dweb schrieb:
Dieser Cast-Operator und der Dereference-Operator haben die gleiche Priorität (3).
Bei gleicher Priorität (3) ist die Abarbeitungsreihenfolge right-to-left.
D.h.: Es wird zuerst gecastet und dann dereferenziert.Warum einfach, wenn es auch kompliziert geht?
Es gibt bei mehreren unären Prefix-Operatoren überhaupt keine Mehrdeutigkeit, die man auflösen müsste: op1 op2 x heißt immer op1 (op2 x). (op1 op2) x ist syntaktisch sinnlos.
Prioritäten ergeben nur Sinn, wenn es Mehrdeutigkeiten gibt, z.B. bei *x++. Heißt das jetzt (*x)++ oder *(x++)? (Letzteres).
Assoziativitäten ergeben nur Sinn bei mehrstelligen Operatoren. Heißt a = b = c jetzt (a = b) = c oder a = (b = c)? (Letzteres, = ist rechtsassoziativ).
-
no_code schrieb:
findest du das buch nicht ein bichen zu umfangreich mit zuviel text und zuwenig infos?
CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true

-
wxSkip schrieb:
CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true

Der Code legt nahe, dass es nur ein Exemplar des Primer gibt. Das ist falsch.
Am besten greifst du so darauf zu:PersonalLibraryManager::findBook("C++ Primer").take()->[usw];
-
l'abra d'or schrieb:
wxSkip schrieb:
CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true

Der Code legt nahe, dass es nur ein Exemplar des Primer gibt. Das ist falsch.
Am besten greifst du so darauf zu:PersonalLibraryManager::findBook("C++ Primer").take()->[usw];(Das vorher war die Internetausgabe
)
Noch besser wird's:home::shelf<Objects::Book>::iterator iter = Bookshelf.findBook("C++ Primer", Language::English); if(iter == Bookshelf.end()) { try { iter = Bookshelf.AddBook(*(Objects::Book*)this->Buy(Buyable::Book, "C++ Primer", Language::English); } catch(LowMoneyException err) { std::cout << "Zu wenig Geld für den Kauf des C++ Primers vorhanden" << std::endl; break; } catch(NotAvailableException err) { std::cout << "Den C++ Primer gibt es momentan nicht zu kaufen" << std::endl; break; } } std::cout << iter->GetRawText().substr(Beispieltext.RawTextStart(), Beispieltext.RawTextLength()).IsInfo() << std::endl; //Ausgabe: "1\n"
-
