VerständnisProblem



  • hallo zusammen,
    habe das folgende Programm geschrieben:

    1. #include<stdio.h>
    2. #include<string.h>
    3. #include <stdlib.h>
    4. int main()
    5. {
    6. #define sample 10
    7. short buffer[sample] = {1,2,3,4,5,6,7,8,9,10};
    8. short *pt1 ;
    9. for(pt1=buffer;pt1<buffer+sample;pt1++)
    10. printf("Bufferinhalt = %d\n",*pt1);
    11. }

    es soll mir einfach den Ihnalt vom buffer ausgeben
    das tut es auch, obwohl ich der Meinung bin, dass Zeile 9 falsch ist denn pt1 ist vom Typ short ( short hat eine bytegrösse von 2) deswegen habe ich am Anfang : for(pt1=buffer;pt1<buffer+2*sample;pt1++) aber das hat nicht das erwartet Ergebnis geliefert hat jemand eine Erklärung dafür ??
    ich habe noch eine kleine Frage und zwar möchte ich wissen , ob ich den inhalt von buffer mit memcpy() kopieren kann ? normallerweise dient memcpy zum kopieren von zeichenketten das verwirt mich ein wenig.

    Vielen dank



  • myouness27 schrieb:

    1. #include<stdio.h>
    2. #include<string.h>
    3. #include <stdlib.h>
    4. int main()
    5. {
    6. #define sample 10
    7. short buffer[sample] = {1,2,3,4,5,6,7,8,9,10};
    8. short *pt1 ;
    9. for(pt1=buffer;pt1<buffer+sample;pt1++)
    10. printf("Bufferinhalt = %d\n",*pt1);
    11. }

    Den Code kann keine Sau lesen 😉



  • myouness27 schrieb:

    hat jemand eine Erklärung dafür ??

    Ja.

    Stichwort "Zeigerarithmetik".



  • ...wenn sich sonst keiner erbarmt

    memcpy heisst memcpy, weil man damit was tun kann?
    richtig! mem kopieren!



  • Doch doch, zeile 9 ist richtig.
    Du hast 10 short Elemente, pt1 = buffer zeigt bei Beginn auf das erste Element.
    Der Zeiger kann jetzt noch 9 mal um zwei Byte erhöht werden, damit er gültig bleibt.
    Das erreichst du korrekt mit pt1<buffer+sample.
    Die Anweisung pt1++ lässt den Zeiger automatisch jeweils um zwei Byte vorrücken,
    weil der Compiler automatisch "weiß", das short 2 Byte hat.

    Jo, und mit memcpy kannst du alles kopieren, was drinsteht.
    Siehe Deklaration von memcpy:
    void *memcpy( void *dest, const void *src, size_t count );
    Du kannst dir dest und src auf den gewünschten Zeigertypen casten.

    Gruß,
    p.



  • nur eine bemerkung am rande: short ist nicht immer 2 bytes... ändert natürlich nix am code, wollt ich nur anmerken... *klugscheiß,duck,weg*



  • proggingmania schrieb:

    Die Anweisung pt1++ lässt den Zeiger automatisch jeweils um zwei Byte vorrücken,
    weil der Compiler automatisch "weiß", das short 2 Byte hat.

    Das ist mir neu, dachte das geht nur mit Char-Variablen (da die 1Byte groß sind).
    Ist nun pt1++; im Falle von short äquivalent mit pt1+=1; oder mit pt1+=2;?

    short schrieb:

    nur eine bemerkung am rande: short ist nicht immer 2 bytes... ändert natürlich nix am code, wollt ich nur anmerken... *klugscheiß,duck,weg*

    Ich dachte int wäre das "Problem", auf 32Bit-Architekturen so groß wie long und auf 16Bit-Architekturen so groß wie short? Wie sieht das eigentlich bei C++ && C# aus, mit der größe von int?



  • Nicht "int" ist das Problem, sondern dass der C und auch C++ Standard nur Verhältnisse festlegt bei den Datentypen, also short <= int <= long wobei int in aller Regel so groß ist wie die Prozessorbreite - heute meistens noch 32 Bit. Theoretisch gibts auch die Möglichkeit dass short/int/long alle gleich groß sind. Wäre standardkonform. Deshalb ist bei Pointerarithmetik das ++ so definiert das wirklich die richtige Größe benutzt wird, weil sonst solch ein Code zwischen verschiedenen Plattformen unwartbar wäre.

    C#, bzw. .Net dagegen definieren wirklich feste Datentypen Int16, Int32, Int64 wo die Größe festgelegt ist.



  • onoz schrieb:

    proggingmania schrieb:

    Die Anweisung pt1++ lässt den Zeiger automatisch jeweils um zwei Byte vorrücken,
    weil der Compiler automatisch "weiß", das short 2 Byte hat.

    Das ist mir neu, dachte das geht nur mit Char-Variablen (da die 1Byte groß sind).
    Ist nun pt1++; im Falle von short äquivalent mit pt1+=1; oder mit pt1+=2;?

    Allgemein gilt: Hat ein Zeiger vom Typ foo die Adresse 0x0, dann ist foo+1 = 0x0 + sizeof(foo). Im Fall eines 2-byte-Short also 0x2.

    onoz schrieb:

    short schrieb:

    nur eine bemerkung am rande: short ist nicht immer 2 bytes... ändert natürlich nix am code, wollt ich nur anmerken... *klugscheiß,duck,weg*

    Ich dachte int wäre das "Problem", auf 32Bit-Architekturen so groß wie long und auf 16Bit-Architekturen so groß wie short? Wie sieht das eigentlich bei C++ && C# aus, mit der größe von int?

    Ein short wird üblicherweise 2 Byte groß sein. Es gibt aber z.B. Architekturen, bei denen ein Byte nicht 8 Bit breit ist, sondern vielleicht 24 Bit. Dann wäre ein char 1 Byte groß, ein short dürfte aber auch ein Byte groß sein, da 2^24-1 ausreichend groß ist um die Vorderungen des Standards (minimaler Wertebereich) zu erfüllen. Betrifft die wenigsten. Ist halt so Wissen mit dem man ganz toll posen kann.



  • onoz schrieb:

    Das ist mir neu, dachte das geht nur mit Char-Variablen (da die 1Byte groß sind).
    Ist nun pt1++; im Falle von short äquivalent mit pt1+=1; oder mit pt1+=2;?

    Hast du z.B. einen Zeiger pt auf long double, und ist long double auf deinem Rechner 10 Bytes lang, dann zeigt der Zeiger nach Ausführung von pt++
    auf die nachsten 10 Byte. Der Compiler kennt die Länge seiner Datentypen.
    Siehe auch Kommentar von TactX.

    Gruß,
    p.


Anmelden zum Antworten