www.mikrocontroller.net

Forum: PC-Programmierung Was macht dieser Codefragment


Autor: Anna Richter (njutik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!

Ich bin gerade dabei, mich in die TCP/IP Socket Programmierung 
einzuarbeiten (TCP/IP Socket in C). Gleich am Anfang ist ein 
Codefragment als allgemeines (nicht mit TCP/IP zu tun)Beispiel 
angebracht und ich kapiere es einfach nicht, was dieser Codefragment 
macht. Kann mir da jemand helfen?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  typedef struct
  {
    int a;
    short s[2];
  }MSG;

  int count = 0;
  MSG *mp, m={6,8,5};
  char *fp, *tp;
  mp = (MSG*)malloc(sizeof(MSG));
Bis hierhin komme ich klar. Die nächste Zeile ist aber unklar.
OK, ich denke, dass fp eben auf das Zeichen zeigt, das in m.s liegt. Nun 
dachte ich, dass m.s = m.s[0] ist, weil ja ein Array ohne Index ein 
Zeiger auf das erste Element des Arrays ist. Offensichtlich ist das 
nicht so. Warum? Und (char*)mp->s? mp ist doch einfach ein zeiger auf 
eine Struktur vom Typ MSG, aber mp wurde doch keine konkrete Struktur 
zugewiesen. Worauf zeigt dann (char*)mp->s? Und eine generelle Frage: 
was bedeutet eigentlich diese Konstruktion (char*)m.s? Warum ist char* 
in Klammern?
  for(fp = (char*)m.s, tp=(char*)mp->s, count=0; count<4;count++)
  {
    if(count==0)
    {
    printf("\nfp = %c (%d)", fp, fp);
    printf("\ntp = %c (%d)", tp, tp);
    }
    *tp++ = *fp++;
    printf("\nfp = %c", fp);
    printf("\ntp = %c", tp);

  }

  return 0;
}

Es wäre echt cool, wenn mir das jemand erklären könnte. Ich sitzte schon 
seit Stunden daran und versuche es zu kapieren. Please!

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und eine generelle Frage:
> was bedeutet eigentlich diese Konstruktion (char*)m.s? Warum ist char*
> in Klammern?
Heißt typecast. Sagt also dem Compiler als was für einen Typ er die 
Variable behandeln soll. Schön zu sehen beim obigen malloc, wo aus void 
 ein MSG  wird.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. wenn du dir den oberen Teil des Quellcodes anschaust siehst du, dass 
fp ein Zeiger auf ein char ist. m ist vom Typ MSG und das s darin ein 
Zeiger auf ein short-Array. Würdest du nun in der for-Schleife das 
(char*) weglassen, dann müsste der Compiler meckern, dass er einem 
char-Zeiger keinen short-Zeiger zuweisen kann. Du musst dem Compiler 
also sagen, dass er den short-Zeiger als char-Zeiger interpretieren soll 
und das machst du mit dem typecast (char*).

2. ob du bei dem Zugriff auf den Inhalt eines structs einen . oder -> 
benutzen musst, hängt davon ab, ob es sich direkt um die Struktur oder 
um einen Pointer auf die Struktur handelt. Bei der Struktur selbst wird 
ein Punkt verwendet, bei einem Pointer auf die Struktur ein ->.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der for_Schleife werden 4 (=> count) Bytes umkopiert und es wird ein 
Primitiv-Debug gemacht (printfs).

Quelle der Kopieraktion ist das s Element einer bestehende MSG Struktur 
und der Quellpointer heisst fp. Da s ein Array (Feld) ist kann fp ohne 
Adressoperator initialisiert werden
> fp = &(m.s[0]) oder m.s
Da m.s[] ein short Array ist, fp aber ein char *, wird ein Cast 
verwendet.

Ziel der Kopieraktion ist das s Element in einer neu mit malloc 
angelegten MSG-Struktur, auf die der Pointer mp zeigt. Der Zielpointer 
tp kann so initialisiert werden
> tp = &((*mp).s[0]) oder (*mp).s oder mp->s
Dazu wieder dann wieder der Cast.

Autor: Anna Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen Dank, Leute! Super, dass Ihr so schnell geantwortet habt. 
Ihr habt mir wirklich geholfen. Euch allen noch einen schönen Sonntag!

Anna

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.