Kommentare, Kommentierung, Verständlichkeit.



  • bool insert(binaryTree * tree, void * data, (int(cmp*)(void*,void*));

    Hat C keinen typedef?

    typedef (int(cmp*)(void*,void*) vergleichsFunction;
    // Oder wie auch immer das in C/C++ war, sorry lange kein C/C++ mehr geschrieben.
    

    The use of typedef is also valuable when you want to declare things whose declaration syntax is painfully impenetrable, like ‘array of ten pointers to array of five integers’, which tends to cause panic even amongst the hardy. Hiding it in a typedef means you only have to read it once and can also help to break it up into manageable pieces:
    typedef int (*a10ptoa5i[10])[5];
    /* or */
    typedef int a5i[5];
    typedef a5i *atenptoa5i[10];

    Try it out!

    😃

    Operatorüberladung gibt es in C wohl auch nicht?



  • DEvent schrieb:

    Hat C keinen typedef?

    Doch schon, aber wozu?

    Operatorüberladung gibt es in C wohl auch nicht?

    Nein.



  • Reyx schrieb:

    Ich habe irgendwann mal 'ne ganz gute Definition gelesen:
    Kommentare sollen nicht sagen, was der Code macht -> Das sieht man am Code selbst!
    Kommentare sollen erklären, warum der Code es so macht, wie er es macht!

    Finde ich sehr gut. Ich musste mal an einem Projekt weiterarbeiten, wo ständig
    solche Zeilen standen:

    i++;  // i wird um 1 erhöht
    

    Da hat man die Hände öfters vorm Gesicht, als auf der Tastatur 😉

    Jockel



  • Bashar schrieb:

    DEvent schrieb:

    Hat C keinen typedef?

    Doch schon, aber wozu?

    für selbstgemachte datentypen, z.b. solche, die auf structs und enums basieren unheimlich praktisch...
    🙂



  • /**
    *Node ist die grundlegende defintion eines Eintrages in einen
    *Binärbaum
    */
    typedef struct
    {
        void * data; /*<der Zeiger auf das Datenelement dieses Knotens*/
        node * leftChild; /*<der Zeiger auf den linken Sohn dieses Knotens (NULL) wenn es keinen linken Sohn gibt*/
        node * rightChild; /*<der Zeiger auf den rechten Sohn dieses Knotens (NULL) wenn es keinen rechten Sohn gibt*/
    } node
    

    😉 wäre mir selber sonst zu umständlich und ist hässlicher zu lesen wenn man immer wieder struct und sowas davor schreiben muss



  • Fedaykin schrieb:

    /**
    *Node ist die grundlegende defintion eines Eintrages in einen
    *Binärbaum
    */
    typedef struct
    {
        void * data; /*<der Zeiger auf das Datenelement dieses Knotens*/
        node * leftChild; /*<der Zeiger auf den linken Sohn dieses Knotens (NULL) wenn es keinen linken Sohn gibt*/
        node * rightChild; /*<der Zeiger auf den rechten Sohn dieses Knotens (NULL) wenn es keinen rechten Sohn gibt*/
    } node
    

    😉 wäre mir selber sonst zu umständlich und ist hässlicher zu lesen wenn man immer wieder struct und sowas davor schreiben muss

    mach's besser so:

    typedef struct __node /* den struct namen besser nicht weglassen */
    {
        void *data; 
        struct __node *leftChild;  /* typedef kann hier noch nicht verwendet werden */
        struct __node *rightChild; /* weils erst später kommt */
    } node_t; /* node_t ist hier besser. an dem _t erkennt man selbstdefinierte typen */
    ...
    node_t myNode; /* ist etwas lesbarer aus als: node myNode */
    ...
    


  • ten schrieb:

    Bashar schrieb:

    DEvent schrieb:

    Hat C keinen typedef?

    Doch schon, aber wozu?

    für selbstgemachte datentypen, z.b. solche, die auf structs und enums basieren unheimlich praktisch...
    🙂

    Das mag sein, ich meinte es aber im bestehenden Kontext und nicht universell.



  • ten schrieb:

    typedef struct __node /* den struct namen besser nicht weglassen */
    {
        void *data; 
        struct __node *leftChild;  /* typedef kann hier noch nicht verwendet werden */
        struct __node *rightChild; /* weils erst später kommt */
    } node_t; /* node_t ist hier besser. an dem _t erkennt man selbstdefinierte typen */
    ...
    node_t myNode; /* ist etwas lesbarer aus als: node myNode */
    ...
    

    Ne ne ne, das ist nicht ANSI/ISO kompatibel! Zwei Unterstriche in Bezeichnern sind dem Compiler vorbehalten!



  • rüdiger schrieb:

    Ne ne ne, das ist nicht ANSI/ISO kompatibel! Zwei Unterstriche in Bezeichnern sind dem Compiler vorbehalten!

    stimmt, hab' ich auch schon mal gehört.
    na, dann nehmen wir einfach was anderes, ein grosses X oder sowas...
    🙂



  • Oder node_s 🙂



  • Fedaykin schrieb:

    /**
    *Node ist die grundlegende defintion eines Eintrages in einen
    *Binärbaum
    */
    typedef struct
    {
        void * data; /*<der Zeiger auf das Datenelement dieses Knotens*/
        node * leftChild; /*<der Zeiger auf den linken Sohn dieses Knotens (NULL) wenn es keinen linken Sohn gibt*/
        node * rightChild; /*<der Zeiger auf den rechten Sohn dieses Knotens (NULL) wenn es keinen rechten Sohn gibt*/
    } node
    

    😉 wäre mir selber sonst zu umständlich und ist hässlicher zu lesen wenn man immer wieder struct und sowas davor schreiben muss

    Klar wäre es so klarer als mit dem struct, aber nicht ANSI-konform (der typedef-Name existiert erst am Ende der Definition, also kannst du ihn "innen" nicht verwenden. In C++ kannst du den struct-Namen ohne typedef direkt verwenden ( struct node{void*data;node*left;node*right;}; , in C benötigst du eine Forward-Deklaration dafür:

    typedef struct node_ node;
    struct node_
    {
      void* data;
      node* left;
      node* right;
    };
    

    @ten und DEvent: Ja, C hat typedef. Aber das ersetzt auch keine Dokumentation (im Gegenteil - du mußt dem Anwender erklären, was sich hinter dem definierten Begriff verbirgt und wie er ihn einsetzen darf).



  • Man kann auch einfach jeweils den gleichen Namen verwenden.

    typedef struct foo { ... } foo;
    


  • Bashar schrieb:

    Man kann auch einfach jeweils den gleichen Namen verwenden.

    typedef struct foo { ... } foo;
    

    kannst auch 'ne instanz anlegen die so heisst:

    typedef struct foo { int x; } foo;
    
    int main()
    {
      foo foo;  // jetzt blickt keiner mehr durch
    }
    

    😃



  • Im anderen Fall blickt man aber auf jeden Fall durch, da man den Struct-Namen nicht ohne das Schlüsselwort 'struct' verwenden kann. Ich frage mich immer wieder, was Menschen dazu treibt, sich die wildesten Namenskonventionen für struct-Tags auszudenken.



  • Bashar schrieb:

    DEvent schrieb:

    Hat C keinen typedef?

    Doch schon, aber wozu?

    Du liest auch nicht was man postet, gelle? Dann bring mir bitte Beispiele/Argumente wieso das schlecht sein soll?

    The use of typedef is also valuable when you want to declare things whose declaration syntax is painfully impenetrable, like ‘array of ten pointers to array of five integers’, which tends to cause panic even amongst the hardy. Hiding it in a typedef means you only have to read it once and can also help to break it up into manageable pieces:
    typedef int (*a10ptoa5i[10])[5];
    /* or */
    typedef int a5i[5];
    typedef a5i *atenptoa5i[10];

    Try it out!

    Nochmal für dich.

    Statt

    (int(cmp*)(void*,void*)
    

    liest man

    vergleichsFunction
    

    (oder etwas ähnliches), und schon muss man sich die Kommentare nicht unbedingt durchlesen um dahinter zusteigen was gemeint ist.



  • DEvent schrieb:

    Du liest auch nicht was man postet, gelle? Dann bring mir bitte Beispiele/Argumente wieso das schlecht sein soll?

    Das Kompliment geb ich direkt zurück. Hab ich gesagt dass irgendwas schlecht ist? Ich mach doch nur Spaß. Mach von mir aus für jeden Datentyp der irgendwo ein Sternchen zuviel enthält ein typedef. Manche brauchen sowas.


Anmelden zum Antworten