Würde mich gern mal mit C befassen

Es gibt 196 Antworten in diesem Thema, welches 20.619 mal aufgerufen wurde. Der letzte Beitrag (24. Mai 2023 um 15:33) ist von Axellander.

  • Ich habe mal eine Frage zum Thema Strukturen:

    Verwendest du möglicherweise einen C++-Compiler um C zu lernen? In der gezeigten Form ist das kein gültiges C-Programm, da fehlt unter anderem das "struct" vor "person" in Zeile 8

    Ausserdem möchte ich nochmal den Hinweis geben, dass man die Compilerwarnungen einschalten, weit hochdrehen und vor allem die gemeldeten Probleme sollte:

    Bitte melde dich an, um diesen Anhang zu sehen.

    (g++ 12.2 via Bitte melde dich an, um diesen Link zu sehen.)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Eins nach dem anderen. Erstmal ohne Vater:

    Klar soweit?

  • structs waren auch etwas in C, das ich lange nicht verstanden hatte. Es hat mir geholfen, die wie eine Klasse in Python zu begreifen, die aber nur Attribute (= Variablen), aber keine Methoden (= Funktionen) halten kann. In Python ist dies für mich gar kein Problem:

    Und so ähnlich ist es halt auch in C mit den structs.

  • Die Zeile

    Code
    typedef struct Person Person;

    bedeutet: Anstelle des Ausdrucks "struct Person" möchte ich im Folgenden nur "Person" schreiben dürfen.

  • Die Zeile

    Code
    typedef struct Person Person;

    bedeutet: Anstelle des Ausdrucks "struct Person" möchte ich im Folgenden nur "Person" schreiben dürfen.

    Besser die Reihenfolge vertauschen, damit in dem struct auch Person verwendet werden kann. Etwa so:

    C
    typedef struct Person Person;
    
    struct Person {
        char name[20];
        int alter;
        Person *mutter;
    };
  • Besser die Reihenfolge vertauschen, damit in dem struct auch Person verwendet werden kann.

    Stimmt. Es widerstrebte mir nur etwas, den "typedef" zu machen, bevor definiert wurde, was "struct Person" eigentlich sein soll. Aber für die Sache mit dem Vater ist das schon nötig, da hast Du recht.

    Nun zu der Sache mit dem Vater: Wenn man also unbedingt über einen Zeiger in einer Struktur auf eine Struktur innerhalb einer Struktur zugreifen will, fängt's an, unangenehm zu werden und man braucht doch so einige Klammern:

    Wenn möglich würde ich das anders lösen, z.B. über eine eigene Struktur für den Vater. Dann ist man danach die Zeigerwirtschaft wieder los:

    Code
    Person v = *(p.vater);
  • Wenn man also unbedingt über einen Zeiger in einer Struktur auf eine Struktur innerhalb einer Struktur zugreifen will, fängt's an, unangenehm zu werden und man braucht doch so einige Klammern

    Dafür gibt es in C auch die bevorzugte Schreibweise ohne Klammern:

    p.vater->name

  • Bei sowas kann man dann aber auch gleich C++ verwenden… :Peace

    Das halte ich aber für eine ganz schöne Übertreibung ;)

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • Bei sowas kann man dann aber auch gleich C++ verwenden… :Peace

    Eine der schönsten C(99)-Erfindungen, die in C++ nicht existiert: Bitte melde dich an, um diesen Link zu sehen..

    Damit gehen dann Dinge wie "struct Person a = { .name = "Kunibert", .alter = 100, .vater = NULL };" :)

    (Okay, die .name-Zuweisung geht mit dem char-Array vermutlich nicht. Aber dennoch!)

  • Eine der schönsten C(99)-Erfindungen, die in C++ nicht existiert

    Nimm einen neueren Compiler ;) Bitte melde dich an, um diesen Link zu sehen. (seit C++20)

    (hat aber ein paar Einschränkungen im Vergleich zur C99-Variante)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Eine der schönsten C(99)-Erfindungen, die in C++ nicht existiert

    Nimm einen neueren Compiler ;) Bitte melde dich an, um diesen Link zu sehen. (seit C++20)

    (hat aber ein paar Einschränkungen im Vergleich zur C99-Variante)

    Ah okay, haben sie's also doch auch endlich übernommen. :)

  • Stimmt. Es widerstrebte mir nur etwas, den "typedef" zu machen, bevor definiert wurde, was "struct Person" eigentlich sein soll. Aber für die Sache mit dem Vater ist das schon nötig, da hast Du recht.

    Weiss nicht ob das C99 auch schon erlaubt ist, aber man kann statt dem typedef auch so deklarieren:

    Code
    struct Person
    {
       char name[20];
       int alter;
       struct Person *vater;
    } Person;

    Allerdings muss man dann in der Klasse selbst das "struct" verwenden, weil der Typ Person ja noch nicht bekannt ist. Da das aber alles an einer Stelle ist, wäre das verschmerzbar.

  • Ich habe mal eine Frage zum Thema Strukturen:

    Verwendest du möglicherweise einen C++-Compiler um C zu lernen? In der gezeigten Form ist das kein gültiges C-Programm, da fehlt unter anderem das "struct" vor "person" in Zeile 8

    Ausserdem möchte ich nochmal den Hinweis geben, dass man die Compilerwarnungen einschalten, weit hochdrehen und vor allem die gemeldeten Probleme sollte:

    Bitte melde dich an, um diesen Anhang zu sehen.

    (g++ 12.2 via Bitte melde dich an, um diesen Link zu sehen.)

    Ich hab die ganze Zeit am Amiga mit HiSoft C++ programmiert. Dort kann man in den Einstellungen den Modus Default, ANSI-C und C++ wählen.

    Ich hatte ANSI-C eingestellt und trotzdem lief das so ohne Warnungen und Fehler durch:

    D.h. also doch erstmal mit einem "richtigen" C-Compiler lernen...

  • Ich hab die ganze Zeit am Amiga mit HiSoft C++ programmiert. Dort kann man in den Einstellungen den Modus Default, ANSI-C und C++ wählen.

    Ich hatte ANSI-C eingestellt und trotzdem lief das so ohne Warnungen und Fehler durch:

    D.h. also doch erstmal mit einem "richtigen" C-Compiler lernen...

    Ist das wirklich ANSI-C? Habe ich noch nie so gesehen. Vor allem dass man dann den Namen der struct gleich als Typ auch deklariert hat und direkt verwenden kann.

    Dummerweise kann man sich nicht unbedingt darauf verlassen nur weil es "bei mir"(tm) funktioniert. Kann auch ein Bug oder eine Erweiterung im Compiler sein. Wenn man nicht mit verschiedenen Compileren arbeiten muss ist das vielleicht egal, das kann allerdings lästig werden, wenn man den selben Code für verschiedene Plattformen verwenden will.

  • D.h. also doch erstmal mit einem "richtigen" C-Compiler lernen...

    Würde ich empfehlen, ja. Zu den Exoten (oder Urgroßvätern) kann man später immer noch kommen. Wenn Du bereit bist, poste doch nochmal Deinen Code für einen richtigen Compiler (nur so aus Interesse).

  • D.h. also doch erstmal mit einem "richtigen" C-Compiler lernen...

    Würde ich empfehlen, ja. Zu den Exoten (oder Urgroßvätern) kann man später immer noch kommen. Wenn Du bereit bist, poste doch nochmal Deinen Code für einen richtigen Compiler (nur so aus Interesse).

    Ja gern.

    Ich habe das jetzt mit dem Online Compiler Bitte melde dich an, um diesen Link zu sehen. gemacht. Da kann man Projekte speichern und auch debuggen - sehr hilfreich und man lernt viel dabei.

    Folgender Code compilierte ohne Fehler und Warnungen.

  • Was mir da auffällt.

    1. Du hast in der Struktur den Member "vater", aber der wird nie benutzt und auch nicht initialisiert. Potentiell gefährlich.

    2. Du wechselst immer hin und her zwischen den Indexes und benutzt den gleichen Pointer. Das macht den Code ziemlich unübersichlich.

    Da wäre es vielleicht besser sowas zu machen, damit es klarer lesbar ist:

    Code
    person *sohn = &pf[0];
       person *vater = &pf[1];
       
       strcpy(sohn->name, "Hansi");
       ....
       sohn->vater = vater;
    
       strcpy(vater->name, "Rudi");
       ....
  • Ah ja stimmt.

    Oder so, das hat auch funktioniert: