Problem mit Zeigern und Werten.



  • Hallo ich bins nochmal. 😃

    Ich habe ein Problem mit der folgenden Aufgabe aus meinen Übungen zu C++.
    Die Aufgabenstellung lautet wie folgt.

    Definieren Sie einen char-Zeiger und eine long-Variable. Die long-Variable ist mit dem Hex-Wert 0x12345678L zu initialisieren.

    Stellen Sie dann die Ausgabe auf Hex um. Zusätzlich soll bei allen nachfolgenden Ausgaben die eingestellte Zahlenbasis mit ausgegeben werden (cout-Flags!).

    Geben Sie zunächst den Inhalt der long Variablen aus. Anschließend ist der Inhalt der long Variable in Byte-Darstellung auszugeben, so wie unten angegeben. Hinweis: Verwenden Sie dazu den char-Zeiger. Die unten stehende Ausgabe gilt nur bei Prozessoren, bei denen das Low-Byte auch auf der niederen Adresse liegt. Bei anderen Prozessoren erhalten Sie eine umgekehrte Ausgabe.

    Zum Schluss ist der char-Zeiger auf die Adresse des String-Literal "ABCD" zu setzen. Der String ist dann mithilfe des char-Zeigers in einzelne Buchstaben zu zerlegen und auszugeben (siehe Programmausgabe unten).
    Die Programmausgabe:

    0x12345678 liegt wie folgt im Speicher:
    0x78,0x56,0x34,0x12
    String ist: ABCD
    In Buchstaben: A,B,C,D

    So sieht mein Programm bis her aus:

    #include <iostream>
    using std::endl;
    int main()
    {
    
       long Var1 = 0x12345678L;
       char *A, *B, *C, *D; 
    
    std::cout << std::hex << Var1 << endl;
    
    A = reinterpret_cast<char*>(A);
    std::cout << &A << ", ";
    B = reinterpret_cast<char*>(B);
    std::cout << &B << ", ";
    C = reinterpret_cast<char*>(C);
    std::cout << &C << ", ";
    D = reinterpret_cast<char*>(D);
    std::cout << &D << ", ";
    

    Programmausgabe:
    12345678
    0x22ff70, 0x22ff6c, 0x22ff68, 0x22ff64,

    Ich weis nicht mehr weiter und bedanke mich schonmal im Voraus!

    Zombi :p



  • Hallo

    Es sollte dir doch selber auffallen, das diese Zeile (und die 3 andern gleichartigen enebso) sinnfrei sind.

    A = reinterpret_cast<char*>(A);
    

    bis bald
    akari



  • Mitlerweile bin ich hier:

    #include <iostream>
    #include <iomanip>
    
    using std::endl;
    
    int main()
    {
    
       long Var1 = 0x12345678L;
       char *Zeiger;
    
    std::cout << std::hex << Var1 << endl;
    
    Zeiger = reinterpret_cast<char*>(Var1);
    

    system("pause");
    return 0;
    }

    Was mach ich nur falsch?!...

    😞



  • Wieso liegt die Variable im Speicher an vier Stellen?

    Mitlerweile bin ich soweit, dass ich einen Wert bekomme. Aber es ist noch fraglich ob der stimmt.

    #include <iostream>
    #include <iomanip>
    
    using namespace::std;
    using std::endl;
    
    int main()
    {
    
       long Var1 = 0x12345678L;
       char *Zeiger = reinterpret_cast<char*>(&Var1);
       long Var2 = *Zeiger;
    
    std::cout.setf(ios::showbase);
        std::cout << hex << Var1;
    std::cout << "liegt wie folgt im Speicher: " << endl;
    
    std::cout << Var2; 
    
    system("pause");
    return 0;
    }
    

    Ausgabe: 0x12345678 liegt wie folgt im Speicher: 0x78
    ENDE

    Wie kommen die drei anderen Werte zu Stande?



  • deZombi schrieb:

    Wieso liegt die Variable im Speicher an vier Stellen?

    Erst einmal einige Gegenfragen:
    a) Warum verwendest du einen char* statt einen long*, hat das irgendwelche Gründe?
    b) Warum sollten 4 verschiedene Zeiger die gleiche Adresse im Speicher belegen (Du hast deren Position und nicht die Adresse der Ursprungsvariablen ausgegeben)?

    #include <iostream>
    #include <iomanip>
    
    using namespace std; // Vorher using namespace::std
    // using std::endl; Unnötig wenn du eh den gesamten Namensraum bekannt machst
    
    int main()
    {
       long Var1 = 0x12345678L;
       long * Zeiger1 = &Var1;
       long * Zeiger2 = &Var1;
    
       std::cout.setf(ios::showbase);
       std::cout << hex << Var1;
       std::cout << "liegt wie folgt im Speicher: " << Zeiger1 << endl;
       std::cout << "liegt wie folgt im Speicher: " << Zeiger2 << endl;
    
       system("pause"); // <-- Kein Fan davon... aber naja
       return 0; // Unnötig, return 0 wird implizit bei main gemacht...
    }
    

    So nun bekommst du auch für Zeiger1 und Zeiger2 deren Inhalt (die Speicheradresse von Var1) geliefert.



  • asc schrieb:

    a) Warum verwendest du einen char* statt einen long*, hat das irgendwelche Gründe?

    die aufgabenstellung nicht gelesen?

    der char-zeiger soll auf die adresse der long variable zeigen. wir wissen, char ist ein byte. der aufgabensteller vermutet zusätzlich, ein byte bestünde aus 8 bit, und eine long variable aus vier byte.
    um nun das erste byte, aus dem das long-objekt besteht, auszugeben, muss der char-zeiger dereferenziert werden. damit dessen wert aber nicht als zeichen interpretiert wird, muss man ihn wohl zunächst nach int casten (oder short oder ...). danach muss der zeiger auf das nächste byte zeigen (d.i. das zweite byte des long-objekts) - und ebenfalls wieder ausgegeben werden. das viermal und man hat die vier bestandteile des long-objekts ausgegeben.

    die übung mit dem string "ABCD" funktioniert übrigens genauso, nur dass der char-zeiger zu beginn eben nicht auf ein long-objekt zeigt, sondern auf den string "ABCD".

    um diese aufgabenstellung zu erfüllen, reicht es also tatsächlich vollkommen, nur zwei variablen zu definieren.



  • asc schrieb:

    deZombi schrieb:

    Wieso liegt die Variable im Speicher an vier Stellen?

    Erst einmal einige Gegenfragen:
    a) Warum verwendest du einen char* statt einen long*, hat das irgendwelche Gründe?
    b) Warum sollten 4 verschiedene Zeiger die gleiche Adresse im Speicher belegen (Du hast deren Position und nicht die Adresse der Ursprungsvariablen ausgegeben)?

    Deswegen:
    Definieren Sie einen char-Zeiger und eine long-Variable. Die long-Variable ist mit dem Hex-Wert 0x12345678L zu initialisieren.

    Stellen Sie dann die Ausgabe auf Hex um. Zusätzlich soll bei allen nachfolgenden Ausgaben die eingestellte Zahlenbasis mit ausgegeben werden (cout-Flags!).

    Geben Sie zunächst den Inhalt der long Variablen aus. Anschließend ist der Inhalt der long Variable in Byte-Darstellung auszugeben, so wie unten angegeben. Hinweis: Verwenden Sie dazu den char-Zeiger. Die unten stehende Ausgabe gilt nur bei Prozessoren, bei denen das Low-Byte auch auf der niederen Adresse liegt. Bei anderen Prozessoren erhalten Sie eine umgekehrte Ausgabe.

    Zum Schluss ist der char-Zeiger auf die Adresse des String-Literal "ABCD" zu setzen. Der String ist dann mithilfe des char-Zeigers in einzelne Buchstaben zu zerlegen und auszugeben (siehe Programmausgabe unten).
    Die Programmausgabe:

    0x12345678 liegt wie folgt im Speicher:
    0x78,0x56,0x34,0x12
    String ist: ABCD
    In Buchstaben: A,B,C,D

    Und wie gebe ich deren Adresse an?



  • queer_boy schrieb:

    danach muss der zeiger auf das nächste byte zeigen (d.i. das zweite byte des long-objekts) - und ebenfalls wieder ausgegeben werden. das viermal und man hat die vier bestandteile des long-objekts ausgegeben.

    Wie setze ich denn den Zeiger auf das nächste byte von Var1?

    Das mit der Ausgabe müsste dann doch auch

    std::cout << "blabla" << Var1;

    sein und dann kommt die Adresse vom 2ten Byte im Speicher als Ausgabe oder bin ich jetzt ganz falsch?[



  • deZombi schrieb:

    Wie setze ich denn den Zeiger auf das nächste byte von Var1?

    der suchbegriff, der dich wohl am weitesten weiterbringt, lautet zeigerarithmetik.
    wahrscheinlich gibt es hier in den FAQs auch gute beispiele, die dir das erläutern 🙂

    den char-zeiger auf das nächste byte (char) zu setzten, funktioniert so

    zeiger++;
    


  • Soooo, ich war zwischendurch mal an der frischen Luft mit dem Fahrrad und hab mich danach wieder dran gesetzt...

    UND JETZT GEHT ES!!!! WOOHOO!! Danke an alle! 😃

    😃 😃 😃 😃 😃



  • mammamia;



  • mammamia;


Anmelden zum Antworten