und nochmal verkettete liste :)



  • also... jetzt sitz ich seit stunden an dieser liste rum und irgendwie
    macht die nur käse... mir dämmert zwar, dass ich einen fehler bei den zuweisungen gemacht hab aber ich komm nicht drauf *heul*...

    der fehler müsste darin liegen... denk ich... wenn jemand einen geistsblitz hat wäre ich dankbar.. sonst sitz wohl noch morgen dran...

    struct StdFormat *addElement(struct StdFormat **start, char c, short l, short d, short n ,char *name)
    {
       struct StdFormat *adrPtr;
    
       if( (*start)==NULL )
       {
          /* reserve memory */
          if( ((*start)=(struct StdFormat*)malloc(sizeof(struct StdFormat))) == NULL )
             return NULL;
          sprintf((*start)->type,"%c", c);
          sprintf((*start)->length,"%d",l);
          sprintf((*start)->dec,"%d", d);
          sprintf((*start)->num,"%d", n);
          strcpy((*start)->name,name);
          (*start)->next = NULL;
          adrPtr = (*start);
       }
       else
       {
          adrPtr = (*start);
    
          /* move to last element */
          while( adrPtr->next != NULL )
             adrPtr = adrPtr->next;
    
          /* reserve memory */
          if( (adrPtr =(struct StdFormat*)malloc(sizeof(struct StdFormat))) == NULL )
             return NULL;
          (*start)->next = adrPtr;
          sprintf(adrPtr->type,"%c", c);
          sprintf(adrPtr->length,"%d",l);
          sprintf(adrPtr->dec,"%d", d);
          sprintf(adrPtr->num,"%d", n);
          strcpy(adrPtr->name,name);
          adrPtr->next = NULL;
       }
    
       return adrPtr;
    }
    

    [ Dieser Beitrag wurde am 02.07.2003 um 13:36 Uhr von Acid-Sky editiert. ]



  • Ist es Absicht, dass du am Beginn des else-Zweigs zwar erst das Ende der Liste suchst, dann aber die Adresse sofort per AdrPtr=malloc... wieder überschreibst? Sicher nicht, aber dann brauchst du 2 Pointer, einen, der auf dein letztes Element zeigt und einen, der auf das neue Element zeigt. Für letzteres kannst du auch gleich adrPtr->next nehmen.



  • gerade aus der mittagspause gekommen 🙂

    danke für die antwort... brachte mich sofort auf die lösung:

    der else teil sieht dann so aus:

    else
        {
            adrPtr = (*start);
    
            /* move to last element */
            while( adrPtr->next != NULL )
                adrPtr = adrPtr->next;
    
            /* reserve memory */
            if( (adrPtr->next =(struct StdFormat*)malloc(sizeof(struct StdFormat))) == NULL )
                return NULL;
            sprintf(adrPtr->type,"%c", c);
            sprintf(adrPtr->length,"%d",l);
            sprintf(adrPtr->dec,"%d", d);
            sprintf(adrPtr->num,"%d", n);
            strcpy(adrPtr->name,name);
            adrPtr->next->next = NULL;
        }
    


  • also, jetzt hab ich schön weitergemacht und alles läuft... bis zur 2. schleife...
    sofern jemand lust und zeit hat kann er sich diesen listen code mal angucken 🙂
    wird in einer schleife aufgerufen, diese erzeugt listen einträge, beim ende der schleife wird die liste gelöscht, im nächsten durchlauf wieder erzeugt mit werten gefüllt... aber: beim erneuten erstellen von listen einträgen (also nach dem löschen) krieg ich ne Unhandled Exception...

    ergänzung: im struct sind char veks, weil die zahlen eine feste länge haben und überdies zur weiterverarbeitung null-terminiert sein müssen...

    struct StdFormat
    {
        char type[5]; // type of the value
        char length[10]; // length of the sent value
        char dec[10]; // has decimales yes/no
        char num[10]; // number of these values sent
        char name[50]; // name of the node
        struct StdFormat *next; // pointer to next element
    };
    
    struct StdFormat *addElement(struct StdFormat **start, char c, short l, short d, short n ,char *name)
    {
        struct StdFormat *adrPtr;
    
        if( (*start)==NULL )
        {
            /* reserve memory */
            if( ((*start)=(struct StdFormat*)malloc(sizeof(struct StdFormat))) == NULL )
                return NULL;
            sprintf((*start)->type,"%c", c);
            sprintf((*start)->length,"%d",l);
            sprintf((*start)->dec,"%d", d);
            sprintf((*start)->num,"%d", n);
            strcpy((*start)->name,name);
            (*start)->next = NULL;
            adrPtr = (*start);
        }
        else
        {
            adrPtr = (*start);
    
            /* move to last element */
            while( adrPtr->next != NULL )
                adrPtr = adrPtr->next;
    
            /* reserve memory  fehler stelle bei 2. durchgang */
            if( (adrPtr->next =(struct StdFormat*)malloc(sizeof(struct StdFormat))) == NULL )
                return NULL;
            sprintf(adrPtr->type,"%c", c);
            sprintf(adrPtr->length,"%d",l);
            sprintf(adrPtr->dec,"%d", d);
            sprintf(adrPtr->num,"%d", n);
            strcpy(adrPtr->name,name);
            adrPtr->next->next = NULL;
        }
    
        return adrPtr;
    }
    
    void deleteList(struct StdFormat *start)
    {
        struct StdFormat *ptr0, *ptr1;
    
        if( start != NULL )
        {
            ptr0 = start->next;
            while( ptr0 != NULL )
            {
                ptr1 = start->next->next;
                start->next = ptr1;
                free(ptr0->next);
                free(ptr0);
                ptr0 = ptr1;
            }
            free(start->next);
            free(start);
            start = NULL;
        }
    }/* end */
    

    [ Dieser Beitrag wurde am 02.07.2003 um 17:50 Uhr von Acid-Sky editiert. ]



  • Mal ne kurze zwischenfrage: in wie fern ist es laut ANSI Standart möglich in einer Structur Funktionen aufzurufen oder sonnstiges zu machen außer Variablen zu speichern?? Soweit ich weiß ist das nicht legal.

    Bitte um Aufklärung!



  • Du meinst, wie in C++? Ne ist nicht legal, aber warum fragst du hier? Hat das was mit dem Thread zu tun?



  • Original erstellt von THE_FreaK:
    Mal ne kurze zwischenfrage: in wie fern ist es laut ANSI Standart möglich in einer Structur Funktionen aufzurufen oder sonnstiges zu machen außer Variablen zu speichern?? Soweit ich weiß ist das nicht legal.
    Bitte um Aufklärung!

    Nein, ist es nicht. Ich denke, du hast dich hier nur verlesen. Bei

    struct StdFormat *addElement(struct StdFormat **start, char c, short l, short d, short n ,char *name)...
    

    handelt es sich natürlich nicht um eine Strukturdeklaration, sondern um eine Funktion, welche einen Zeiger auf eine Variable vom Typ struct StdFormat zurück gibt 😉


Anmelden zum Antworten