C-Tutorial - kleine Fehlerliste

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

C-Tutorial - kleine Fehlerliste

Beitrag von stampuhh » Do Nov 19, 2009 6:17 pm

So,

ich habe mal wieder ein bisschen weiter gearbeitet mit C. Hab dabei auch so ein bisschen raus geschrieben was ich nicht ganz verstanden habe, oder wo mir etwas gefehlt hat. Ich bin im Moment bei Listen. Also falls ich etwas als fehlend anprangere und es später noch kommen sollte bitte einfach ignorieren ;)

1. Headerdateien beschreiben. Was ist das und was kann man damit machen? Wie strukturiere ich ein größeres Projekt. Ist mir bis jetzt noch nicht ganz klar wie ich "riesige" Dateien vermeiden kann.

2. c:list:single-linked
- Beispiel ganz unten: "Freigabe der anderen Nodes" Wie sieht das genau aus?
- Funktion GetIndex ist fehlerhaft (Tippfehler und null sollte NULL sein?)
- Da sitze ich gerade dran. Struct Address wird zwar ins Beispiel eingebaut, eine entsprechende Implementierung fehlt aber (oder ich bin zu doof sie zu finden). Warum nicht einfach einen Integer als Data?
Getestet habe ich das Ganze noch nicht ob es überhaupt läuft wenn alle Fehler entfernt sind.

3. c:binarysearch
Jetzt würde mich aber schon interessieren wie man so was denn nun implementiert ;) Das Konzept hab ich schon verstanden (allerdings lernt man das als Informatikstudent ja auch oft genug. Bin ich vielleicht die falsche Person um zu sagen ob es für "Anfänger" verständlich war)

4. c:list:head
im Beispielcode steht head was es aber gar nicht gibt. Gibt also Fehlermeldungen beim Compilieren. Sollte wohl: list->First heißen?

Wenn es ok ist werde ich weitere Fehler hier schreiben? Oder soll ich immer einen neuen Thread aufmachen?

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial - kleine Fehlerliste

Beitrag von Xin » Do Nov 19, 2009 7:10 pm

Hallo stampuhh!

Ich muss leider sofort wieder los, ansonsten würde ich mir die Liste sofort ansehen.
Aber sei versichert, die Liste gehe ich diese Woche noch durch.

In jedem Fall finde ich absolut super, dass Du die Liste geschrieben hast!
stampuhh hat geschrieben:Wenn es ok ist werde ich weitere Fehler hier schreiben? Oder soll ich immer einen neuen Thread aufmachen?
Nach kurzem Grübeln, bitte ich Dich neue Threads aufzumachen, damit man die zu bearbeitenden Punkte im ersten Posting stehen und nicht mittem im Thread verloren gehen. Sind alle Punkte bearbeitet, kann man den Thread dann mit einem entsprechendem Kommentar beenden/schließen und es ist klar, dass in der Mitte nicht noch übersehene Punkte verloren gehen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C-Tutorial - kleine Fehlerliste

Beitrag von stampuhh » Fr Nov 20, 2009 11:55 am

Kurz noch was zu dem da oben.

Die Beispiele in c:list:head sind in sich überhaupt nicht stimmig. DeleteAddressList wird mit keinem Parameter in main aufgerufen. Dann wird in der Funktion selber DeleteNode nur mit einem Parameter statt zwei aufgerufen. Ich bin noch nicht ganz dahinter gestiegen wie es denn richtig wäre aber arbeite noch dran ;)

Außerdem habe ich irgendwie noch ein Problem mit NewAddressList(). Ich gehe mal davon aus, dass das eine Funktion ist. Aber von welchem Typ? void? Und wenn ja was bewirkt dann die Zuweisung in der main "list = NewAddressList()"? Wenn nicht wo ist dann das return-Statement? :?
Mein Compiler jedenfalls hat damit schon mal keine Probleme^^

edit: doch hat er. Er spuckt eine Warnung aus: "warning: control reaches end of non-void function". Vermutlich fehlt also ein "return newList"

Nächstes mal mach ich dann auch ein neues Thema auf aber ich fand das hier gehört noch hier zu weil ich es oben ja schon erwähnt hatte.

edit: Habe jetzt mal das Beispiel komplett. Stimmt das so alles? Es läuft zwar ohne irgendwelche Fehler zu melden aber ganz sicher bin ich mir nicht. Vor allem was die beiden Funktionen GetNode() und GetIndex() angeht!

Code: Alles auswählen

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

struct Address
{
    char *Strasse;
    int hausnummer;
};

struct AddressNode
{
    struct AddressNode * Next;

    struct Address       Data;
};

struct AddressList
{
    struct AddressNode * First;

    char               * FileName;
};


struct AddressNode * NewNode( struct AddressList * list, struct AddressNode * prevNode )
{
    struct AddressNode * newNode = (struct AddressNode *) malloc( sizeof( struct AddressNode ) );

    if ( prevNode )
    {
        newNode ->Next = prevNode->Next;
        prevNode->Next = newNode;
    }
    else
    {
        newNode->Next = list->First;
        list->First = newNode;
    }

    printf("Neue Node erstellt\n");
    return newNode;
}

int GetIndex( struct AddressNode * head, struct AddressNode * element )
{
    int index = 0;


    while ( head != element && element != NULL )
    {
        index ++;

        element = element->Next;
    }

    /* index zurückgeben, wenn gefunden */

    if ( head == element )
        return index;

    /* Falls nicht gefunden, Fehler zurückgeben */

    return -1;
}

struct AddressNode * GetNode( struct AddressNode * head, int index )
{
    while ( index > 0 && head != NULL )
    {
        head = head->Next;
    }

    return head;
}

void DeleteNode( struct AddressList * list, struct AddressNode * toBeRemoved )
{
    /* Vorgänger finden */

    struct AddressNode * prev;

    if ( toBeRemoved == list->First )
    {
        /* Wir entfernen den Listenkopf, daher beginnt die Liste ab sofort am Nachfolgerelement */

        list->First = list->First->Next;          // Listenkopf verschieben
    }
    else
    {
        /* Es ist nicht das Kopfelement */

        int index = GetIndex( list->First, toBeRemoved );
        prev = GetNode( list->First, index - 1 );
        prev->Next = toBeRemoved->Next;
    }

    free( toBeRemoved );
    printf("Node geloescht\n");
}

struct AddressList * NewAddressList()
{
    struct AddressList * newList = (struct AddressList *) malloc( sizeof( struct AddressList ) );

    newList->First = NULL;
// newList->Counter = 0;  // Für den Fall, dass ein Counter implementiert wird
    printf("Neue Liste wird erstellt\n");
    return newList;
}

void DeleteAddressList(struct AddressList * toBeRemoved )
{
    /* Alle Elemente entfernen */

    while (toBeRemoved->First )
        DeleteNode(toBeRemoved,  toBeRemoved->First );

    free( toBeRemoved );
    printf("Liste geloescht\n");
}

int main()
{

    struct AddressList * list;
    struct AddressNode * node;

    list = NewAddressList();

    node = NewNode( list, NULL );  // Erste Node anlegen.
    node = NewNode( list, node );  // zweite Node anlegen
    node = NewNode( list, node );  // dritte Node anlegen

    /* Node entfernen, auf die 'node' zeigt */

    DeleteNode( list, node );

    /* Zuvor haben wir uns um die Freigabe des Speichers gar nicht gekümmert! */

    DeleteAddressList(list);

    return 0;

}
gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial - kleine Fehlerliste

Beitrag von Xin » Fr Nov 20, 2009 5:19 pm

stampuhh hat geschrieben:Kurz noch was zu dem da oben.

Die Beispiele in c:list:head sind in sich überhaupt nicht stimmig. DeleteAddressList wird mit keinem Parameter in main aufgerufen. Dann wird in der Funktion selber DeleteNode nur mit einem Parameter statt zwei aufgerufen. Ich bin noch nicht ganz dahinter gestiegen wie es denn richtig wäre aber arbeite noch dran ;)
Kurze Antwort: Auf der Seite davor, wird DeleteNode mit den Parametern (Node * prev und Node *toDelete) definiert. Der erste Schritt wäre den Listenkopf hinzuzufügen: DeleteNode(Head * head, Node * prev, Node *toDelete ).
Durch den Listenkopf wird prev überflüssig, so wird daraus DeleteNode(Head * head, Node *toDelete ).
stampuhh hat geschrieben:Außerdem habe ich irgendwie noch ein Problem mit NewAddressList(). Ich gehe mal davon aus, dass das eine Funktion ist. Aber von welchem Typ? void? Und wenn ja was bewirkt dann die Zuweisung in der main "list = NewAddressList()"? Wenn nicht wo ist dann das return-Statement? :?
Mein Compiler jedenfalls hat damit schon mal keine Probleme^^
der Rückgabetyp ist struct AddressList * - return fehlt im Listing.
stampuhh hat geschrieben:edit: doch hat er. Er spuckt eine Warnung aus: "warning: control reaches end of non-void function". Vermutlich fehlt also ein "return newList"
Ich werde die Quellen nochmal zusammensetzen und dann als (getestetes) ZIP zum Download anbieten.

edit: Habe jetzt mal das Beispiel komplett. Stimmt das so alles? Es läuft zwar ohne irgendwelche Fehler zu melden aber ganz sicher bin ich mir nicht. Vor allem was die beiden Funktionen GetNode() und GetIndex() angeht![/quote]
GetNode sieht gut aus, GetIndex nicht... *grummel*
Da fehlt ein "index--" in der Schleife.

Ich glaube, ich habe heute abend noch was zu tun...
Danke für die Rückmeldung!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C-Tutorial - kleine Fehlerliste

Beitrag von stampuhh » Fr Nov 20, 2009 6:17 pm

Dann biete ich dir mal eine Version an, die zumindest aus meiner Sicht läuft.

Ich habe einfach mal Daten hinzugefügt und Ausgaben um das ganze verfolgen zu können. Die getIndex() so wie sie in meinem oben erwähntem Code steht sollte falsch sein. Wenn ich zB. hier in meinem Code "node2" gelöscht habe wurden die Nodes 2 und 3 komplett verworfen. Gelöscht wurden nachher nur noch 5-8. So wie ich es jetzt habe wird erst nur Node2 (Sprich Node mit Hausnummer 4) gelöscht und durch DeleteAddressList() werden dann die restlichen gelöscht (hoffentlich)

Code: Alles auswählen

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

struct Address
{
    int hausnummer;
};

struct AddressNode
{
    struct AddressNode * Next;

    struct Address       Data;
};

struct AddressList
{
    struct AddressNode * First;

    char               * FileName;
};


struct AddressNode * NewNode( struct AddressList * list, struct AddressNode * prevNode )
{
    struct AddressNode * newNode = (struct AddressNode *) malloc( sizeof( struct AddressNode ) );

    if ( prevNode )
    {
        newNode ->Next = prevNode->Next;
        prevNode->Next = newNode;
    }
    else
    {
        newNode->Next = list->First;
        list->First = newNode;
    }

    printf("Neue Node erstellt\n");
    return newNode;
}

int GetIndex( struct AddressNode * head, struct AddressNode * element )
{
    int index = 0;

    if ( head == element )
    {
        printf("Der Index ist: %d\n", index);
        return index;
    }

    struct AddressNode * next = head->Next;

    while ( next != element && next != NULL )
    {
        index ++;

        printf("Element = %d\n",(*next).Data.hausnummer);
        next = next->Next;
    }

    if(next == element)
    {
        printf("Der Index ist: %d\n", index+1);
        return index+1;
    }

    printf("return -1\n");
    return -1;
}

struct AddressNode * GetNode( struct AddressNode * head, int index )
{
    while ( index > 0 && head != NULL )
    {
        head = head->Next;
        index--;
    }

    return head;
}

void DeleteNode( struct AddressList * list, struct AddressNode * toBeRemoved )
{
    /* Vorgänger finden */

    printf("Und wir loeschen Node %d\n", (*toBeRemoved).Data.hausnummer);
    struct AddressNode * prev;

    if ( toBeRemoved == list->First )
    {
        /* Wir entfernen den Listenkopf, daher beginnt die Liste ab sofort am Nachfolgerelement */

        printf("Das zu loeschende Element ist First\n");
        list->First = list->First->Next;          // Listenkopf verschieben
    }
    else
    {
        /* Es ist nicht das Kopfelement */
        printf("Das zu loeschende Element ist nicht First\n");
        int index = GetIndex( list->First, toBeRemoved );
        prev = GetNode( list->First, index-1 );
        printf("Der Vorgaenger ist: %d\n", (*prev).Data.hausnummer);
        prev->Next = toBeRemoved->Next;
    }

    free( toBeRemoved );
    printf("Node geloescht\n");
}

struct AddressList * NewAddressList()
{
    struct AddressList * newList = (struct AddressList *) malloc( sizeof( struct AddressList ) );

    newList->First = NULL;
// newList->Counter = 0;  // Für den Fall, dass ein Counter implementiert wird
    printf("Neue Liste wird erstellt\n");
    return newList;
}

void DeleteAddressList(struct AddressList * toBeRemoved )
{
    /* Alle Elemente entfernen */

    while (toBeRemoved->First )
        DeleteNode(toBeRemoved,  toBeRemoved->First );

    free( toBeRemoved );
    printf("Liste geloescht\n");
}

void PrintAdressList(struct AddressList * toPrint)
{
    struct AddressNode * element = toPrint->First;

    while (element != NULL)
    {
        printf("Element = %d\n",(*element).Data.hausnummer);
        element = element->Next;
    }
}

int main()
{

    struct AddressList * list;
    struct AddressNode * node;
    struct AddressNode * node2;
    struct Address addy;

    list = NewAddressList();

    node = NewNode( list, NULL );  // Erste Node anlegen.
    addy.hausnummer = 1;
    (*node).Data = addy;

    node = NewNode( list, node );  // zweite Node anlegen
    addy.hausnummer = 2;
    (*node).Data = addy;
    node = NewNode( list, node );  // dritte Node anlegen
    addy.hausnummer = 3;
    (*node).Data = addy;
    node2 = NewNode( list, node );
    addy.hausnummer = 4;
    (*node2).Data = addy;
    node = NewNode( list, node2 );
    addy.hausnummer = 5;
    (*node).Data = addy;
    node = NewNode( list, node );
    addy.hausnummer = 6;
    (*node).Data = addy;
    node = NewNode( list, node );
    addy.hausnummer = 7;
    (*node).Data = addy;
    node = NewNode( list, node );
    addy.hausnummer = 8;
    (*node).Data = addy;

    /* Liste ausgeben */
    printf("----------- Ausgeben: -----------\n");
    PrintAdressList(list);
    printf("----------- Ausgeben Ende -------\n");

    /* Node entfernen, auf die 'node2' zeigt */

    printf("Node entfernen!\n");
    DeleteNode( list, node2 );

    /* Liste noch einmal ausgeben */
    printf("----------- Ausgeben: -----------\n");
    PrintAdressList(list);
    printf("----------- Ausgeben Ende -------\n");
    /* Zuvor haben wir uns um die Freigabe des Speichers gar nicht gekümmert! */

    printf("Und jetzt alle loeschen!\n");
    DeleteAddressList(list);

    return 0;

}
hoffe das stimmt so? Würde mich freuen wenn mir da jemand Feedback zu gibt ;)

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial - kleine Fehlerliste

Beitrag von Xin » Sa Nov 21, 2009 12:15 pm

stampuhh hat geschrieben:1. Headerdateien beschreiben. Was ist das und was kann man damit machen? Wie strukturiere ich ein größeres Projekt. Ist mir bis jetzt noch nicht ganz klar wie ich "riesige" Dateien vermeiden kann.
-- TODO --

Der Artikel zum Programmierstil müsste sowieso mal Auseinandergenommen und neu zusammengesetzt werden, als eigener Namensraum im Idealfall. Da sollte das dann mit rein.
stampuhh hat geschrieben:2. c:list:single-linked
- Beispiel ganz unten: "Freigabe der anderen Nodes" Wie sieht das genau aus?
Genauso, wie bei der anderen Node - ich habe es erweitert.
Edit: Und wieder rausgenommen, weil es sich ansonsten mit der nächsten Seite beißt ^
stampuhh hat geschrieben:- Funktion GetIndex ist fehlerhaft (Tippfehler und null sollte NULL sein?)
Korrigiert.
stampuhh hat geschrieben:- Da sitze ich gerade dran. Struct Address wird zwar ins Beispiel eingebaut, eine entsprechende Implementierung fehlt aber (oder ich bin zu doof sie zu finden). Warum nicht einfach einen Integer als Data?
Es ist ein Beispiel, es war eigentlich dafür gedacht, dass man sich das selbst erarbeitet. Daher sah ich es nicht als notwendig an, eine struct Addresse zu definieren, weil es eigentlich vollkommen egal ist, was als Datum verwendet wird. Die Adresse habe ich lediglich verwendet, damit man etwas hat, was man sich vorstellen kann.

Ich habe eine Definition hinzugefügt.
stampuhh hat geschrieben:Getestet habe ich das Ganze noch nicht ob es überhaupt läuft wenn alle Fehler entfernt sind.
Ich werde ein kompilierendes Beispielprojekt anlegen.
stampuhh hat geschrieben:3. c:binarysearch
Jetzt würde mich aber schon interessieren wie man so was denn nun implementiert ;) Das Konzept hab ich schon verstanden (allerdings lernt man das als Informatikstudent ja auch oft genug. Bin ich vielleicht die falsche Person um zu sagen ob es für "Anfänger" verständlich war)
Binary-Sort ist leider noch nicht fertig und auf der Prioritätenliste etwas abgerutscht. Da offenbar Bedarf besteht, rutscht es nun wieder hoch.

Du studierst Informatik?
stampuhh hat geschrieben:4. c:list:head
im Beispielcode steht head was es aber gar nicht gibt. Gibt also Fehlermeldungen beim Compilieren. Sollte wohl: list->First heißen?
Richtig erkannt und korrigiert.
stampuhh hat geschrieben:Außerdem habe ich irgendwie noch ein Problem mit NewAddressList(). Ich gehe mal davon aus, dass das eine Funktion ist. Aber von welchem Typ? void? Und wenn ja was bewirkt dann die Zuweisung in der main "list = NewAddressList()"? Wenn nicht wo ist dann das return-Statement? :?
Mein Compiler jedenfalls hat damit schon mal keine Probleme^^
der Rückgabetyp ist struct AddressList * - return fehlt im Listing.[/quote]
Korrigiert.

Nochmals danke für diese Rückmeldung. Ich werde heute noch ein Listen-Projekt anlegen und mir den Listen-Artikel nochmal komplett durchlesen. Wenn man das Zeug gerade geschrieben hat, kann man nur jemand anderen bitten, drüber zu gucken, weil man selbst ja glaubt alles richtig gemacht zu haben und so sieht man die teils offensichtlichsten Fehler nicht.

Grundsätzlich gilt: Wenn Du Dir sicher bist, einen Fehler gefunden zu haben - es ist ein Wiki. Du darfst auch gerne die Fehler mit rausnehmen und die Korrektur kurz hier melden, damit jemand anderer das nochmal gegenchecke n kann. Darum melden wir hier auch neue Artikel, damit jemand anderer drüber guckt. Wenn Du dir unsicher bist, frag' hier nach, wie Du es hiermit getan hast - in jedem Fall wird die Qualität des Tutorials damit deutlich gesteigert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C-Tutorial - kleine Fehlerliste

Beitrag von stampuhh » Sa Nov 21, 2009 2:58 pm

Danke schon mal für die Rückmeldung!
Xin hat geschrieben: Du studierst Informatik?
[...]
Grundsätzlich gilt: Wenn Du Dir sicher bist, einen Fehler gefunden zu haben - es ist ein Wiki. Du darfst auch gerne die Fehler mit rausnehmen und die Korrektur kurz hier melden, damit jemand anderer das nochmal gegenchecke n kann. Darum melden wir hier auch neue Artikel, damit jemand anderer drüber guckt. Wenn Du dir unsicher bist, frag' hier nach, wie Du es hiermit getan hast - in jedem Fall wird die Qualität des Tutorials damit deutlich gesteigert.
Ja ich studiere Informatik ;)
Was man da aber nicht lernt ist Programmieren. Daher muss ich mir das selber beibringen wenn es mich interessiert. Gibt auch Leute die sich komplett ohne durchs Studium mogeln. :geek:

Ja werde ich nächstes mal gucken ob ich das vielleicht direkt verbessern kann. Wenn ich raus gefunden habe wie das funktioniert ;)

Hast du dir meinen Beispiel-Code im letzten Post einmal angeschaut? Da habe ich ein paar Änderungen vorgenommen (z.B. auch an der GetIndex()) und ich denke er sollte jetzt so lauffähig sein. Wäre schön wenn sich das jemand noch einmal anschauen könnte :)

So ich bin dann wieder an der Luft und arbeite mich nachher weiter durchs Tuto.

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C-Tutorial - kleine Fehlerliste

Beitrag von Xin » Sa Nov 21, 2009 6:12 pm

stampuhh hat geschrieben:Danke schon mal für die Rückmeldung!
Genug der Dankerei... Du lieferst mir die Fehler, die ich peinlicherweise geschrieben habe und Du selbst lernst hoffentlich trotzdem was dabei. :-)
stampuhh hat geschrieben:Ja ich studiere Informatik ;)
Schön, dann bin ich wenigstens nicht mehr alleine ^^
stampuhh hat geschrieben:Was man da aber nicht lernt ist Programmieren. Daher muss ich mir das selber beibringen wenn es mich interessiert. Gibt auch Leute die sich komplett ohne durchs Studium mogeln. :geek:
Hallo Uni ^^
stampuhh hat geschrieben:Ja werde ich nächstes mal gucken ob ich das vielleicht direkt verbessern kann. Wenn ich raus gefunden habe wie das funktioniert ;)
Anmelden und unten auf 'Seite bearbeiten' klicken.
stampuhh hat geschrieben:Hast du dir meinen Beispiel-Code im letzten Post einmal angeschaut? Da habe ich ein paar Änderungen vorgenommen (z.B. auch an der GetIndex()) und ich denke er sollte jetzt so lauffähig sein. Wäre schön wenn sich das jemand noch einmal anschauen könnte :)
Werde ich nachher wohl noch tun, ein Projekt daraus basteln. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C-Tutorial - kleine Fehlerliste

Beitrag von stampuhh » Sa Nov 21, 2009 7:24 pm

Genug der Dankerei... Du lieferst mir die Fehler, die ich peinlicherweise geschrieben habe und Du selbst lernst hoffentlich trotzdem was dabei. :-)
Das stimmt allerdings^^
Probiere i.d.R. so lange rum bis es funktioniert. Nur ob es dann richtig ist, ist halt die Frage :D

Werde das mit dem Anmelden nachher mal probieren wenn ich mein pw wieder gefunden habe. Dank Speicherfunktion merkt man sich so was ja nicht mehr :roll:

Habe noch eine kleine Frage:
Angenommen meine Adresse sieht so aus:

Code: Alles auswählen

struct Address
{
    int hausnummer;
    char * Familienname;
};
Ich erstelle jetzt eine Node und übergebe ihr Daten. Dann allokiere ich für den "Familiennamen" ja Speicher und weise die "Adresse" der Node zu. Wenn ich die Node dann lösche, existiert die "Adresse" dann noch? Muss ich also zusätzlich noch ein

Code: Alles auswählen

free((*toBeRemoved).Data.Familienname);
ausführen in DeleteNode()?

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: C-Tutorial - kleine Fehlerliste

Beitrag von Kerli » So Nov 22, 2009 1:15 am

stampuhh hat geschrieben:Ich erstelle jetzt eine Node und übergebe ihr Daten. Dann allokiere ich für den "Familiennamen" ja Speicher und weise die "Adresse" der Node zu. Wenn ich die Node dann lösche, existiert die "Adresse" dann noch? Muss ich also zusätzlich noch ein

Code: Alles auswählen

free((*toBeRemoved).Data.Familienname);
ausführen in DeleteNode()?
Die Adresse wird immer existieren, die Frage ist nur ob der Speicher auf die diese Adresse zeigt freigegeben wird :P Und du hast völlig richtig erkannt, dass der Speicher nicht automatisch freigegeben wird. Als Grundsatz kannst du dir merken dass du zu jedem malloc irgendwo auch ein free brauchst, da in C nichts automatisch freigegeben wird.

Achja und deine Schreibweise ist zwar korrekt aber nicht unbedingt die Übliche. Anstatt '(*toBeRemoved).Data' kann man nämlich kürzer 'toBeRemoved->Data' schreiben. Diese Schreibweisen sind aber vollkommen gleichwertig, nur dass hauptsächlich die zweite verwendet wird...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten