tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
297
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Hey Leute!
    Ich bin gerade am C++ lernen und bin jetzt im Buch "Thinking in C++" über eine Aufgabe gestolpert, die ich nicht ganz verstehe. Ich poste hier nur die wesentlichen Codeschnipsel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    struct Stash     // Sollte Hilfe bei der Speicherreservierung sein
    {
        int size;                    // Die Grundgröße in Bytes, um die immer erhöht wird
        int quantity;                // Die Anzahl der Speichereinheiten
        int next;                    // Zeigt an, wo der unbenützte Speicher beginnt
        unsigned char *storage;      // Der reservierte Speicher
     
        void initialize (int size);     
        void cleanup();                
        int add (const void *element); 
        void *fetch (int index);
        int count();
        void inflate (int increase);
    };

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    int Stash::add (const void *element)  // Funktion, um einen Wert im Speicher zu speichern
    {
        unsigned char *e;
        int i, startBytes;
     
        if (next >= quantity)    // Next markiert das nächste leere Element
        {
            inflate (increment);    // Es wird wieder Speicher hinzugefügt
        }
     
        startBytes = next * size;          // In startBytes wird gespeichert, ab welchem Element der Speicher noch unbeschrieben ist
        e = (unsigned char *) element;     // e zeigt auf die angegebene Adresse. wird in unsigned char * umgewandelt, damit man mit allen Typen gleich verfahren kann
     
        for (i = 0; i < size; i++)    // Da e auf unsigned char * ist, ist jedes Element ein eigenes Byte, deshalb bis size
        {
            storage[startBytes+i] = e[i];
        }
     
        cout << endl << endl << endl;
     
        next++;
     
        return (next-1);
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    int main ()
    {
        Stash intStash;
     
         intStash.initialize (sizeof (int));
     
        for (int i = 0; i < 99; i++)
        {
            intStash.add (&i);
        }
     
        for (int j = 0; j < intStash.count(); j++)
        {
            cout << "intStash.fetch (" << j << ") = " << * (int *)intStash.fetch (j) << endl;  // wieder auf int* zurückcasten
        }
    }

    Jetzt meine Frage:
    In der main() wird in der 9.Zeile ein int* übergeben. Das wird dann in der Funktion add() zu einem unsigned char* gecastet. Nur was passiert dann in der for-Schleife im Speicher?

    Wenn ich jetzt einen int-Wert (auf den der Zeiger zeigt) von z.B. 100000 habe: Wie wird die Zahl dann auf die char-Elemente aufgeteilt?
    Am Schluss wird ja dann alles wieder mit fetch() ausgegeben.

    Lg
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    was ist genau nicht klar?

    Es wird ein 4-Byte-int übergeben (auf 32bit-Rechnern)
    Das wird dann in add als 4 einzelne Byte (char) behandelt.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Ja was läuft da genau im Speicher ab?
    Wenn ich jetzt einen Zeiger auf eine große Zahl übergebe und den Zeiger auf unsigned char* caste, dann wird ja die große Zahl irgendwie auf die Speicherbereich aufgeteilt oder?

    Also zum Beispiel:

    z zeigt auf 100000. Der Speicherblock: |_____|
    Jetzt caste ich z auf unsigned char, dann zeigt z ja auf einen kleineren Teil: |_|_|_|_|
    Jetzt muss die Zahl ja, wenn sie groß ist auf die Speicherblöcke aufgeteilt werden oder? Bzw. auf die ersten zwei oder drei, das hängt dann davon ab wie groß die Zahl ist verstehe ich das richtig?

    Lg
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    im Speicher passiert überhauüt nichts.

    Zuerst einmal, eine Zahl kann ja führene Nullen haben
    und hat trotzdem noch immer den gleichen Wert. zB.
    00123 = 123
    Das gilt auch fürs Binärsystem (und jedes Andere, Hex. usw.)
    00101 = 101

    Eine 4-Byte-Zahl hat logischerweise 32 bit, 32 Binärstellen.
    zB.
    100101001010000111111110000
    ist in 32 Stellen
    00000100101001010000111111110000
    Jetzt wird die 32-Wurscht gedanklich in 4 Achterblöcke aufgeteilt:
    00000100 10100101 00001111 11110000
    Und das sind sie char-Werte...

    Eigentlich kommt noch die Endianess dazu (Reihenfolge der Bit schon im int etwas verdreht,
    verglichen mit menschlicher Umrechnung), aber das ändert nichts an der Aufteilung.
    ibafluss bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Vielen Dank

    Lg
     

Ähnliche Themen

  1. Konvertierung von char zu hex
    Von touristguy im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 26.10.09, 13:11
  2. Konvertierung VCL Editfeld Inhalt in char
    Von MaRlik im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 27.05.09, 15:11
  3. Konvertierung textBox (hex) nach unsigned char
    Von mrlowbyte im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 16.10.07, 15:25
  4. Konvertierung von int in char
    Von natsu1000 im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 11.05.07, 14:32
  5. Antworten: 3
    Letzter Beitrag: 01.02.06, 13:41