- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Verkettete Liste für ASURO

  1. #1
    Benutzer Stammmitglied Avatar von Spacy Bar
    Registriert seit
    10.05.2014
    Beiträge
    34

    Verkettete Liste für ASURO

    Anzeige

    E-Bike
    Hallo Community,

    Ich habe mal auf dem PC ein Programm geschrieben, dass Zahlenwerte in einer Verketteten Liste speichert. Ich dachte mir, dass kann der Robby auch nur Zahlen sind witzlos, es müssen schon char-Arrays/Strings sein. Das ganze endete in einem Zeigergewirr mit Strukturgewirr verknüpft. Ich hoffe ihr habt eine Lösung für mein Problem, ich habe 'ne ganze menge Zeit rein investiert.
    Code:
    #include "asuro.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct knoten {
    	char wort[16];
    	struct knoten *next;
    };
    
    typedef struct knoten Knoten_t;
    typedef struct knoten* KnotenPtr_t;
    KnotenPtr_t anfang = NULL;
    
    void einfuegenknoten( KnotenPtr_t neu ) {
    	KnotenPtr_t hilfZeiger;
    	if( anfang == NULL ) {
    		anfang = neu;
    		neu->next = NULL;
    	}
    	else {
    		hilfZeiger = anfang;
    		while(hilfZeiger->next != NULL) hilfZeiger = hilfZeiger->next;
    		hilfZeiger->next = neu;
    		neu->next = NULL;
    	}
    }
    
    void neuerKnoten(void){
    	KnotenPtr_t neu = malloc(sizeof(Knoten_t));
    	if( neu == NULL){
    		SerWrite("Speicher ist voll/Kein Speicher vorhanden!\n\r",45);
    		return;
    	}
    	SerWrite("Wert für Knoten eingeben:\n\r",26);
    	do { SerRead(wort[16] ,15,0);
    	} while( getchar()!='\n');
    }
    
    void loescheKnoten(char txt[]){
    	KnotenPtr_t hilfZeiger1;
    	KnotenPtr_t hilfZeiger2;
    	if(anfang != NULL){
    		char tmp[] = anfang->wort
    		else if( strcmp(txt[], tmp[]) == 0 ){
    			hilfZeiger1 = anfang->next;
    			free(anfang);
    			anfang = hilfZeiger1;
    		}
    		else {
    			hilfZeiger1 = anfang;
    			while(hilfZeiger1->next != NULL){
    				hilfZeiger2 = hilfZeiger1->next;
    				char tmp2[] = hilfZeiger2->wort[];
    				if( strcmp( txt[] , tmp2[]) == 0 ){
    					hilfZeiger1->next = hilfZeiger2->next;
    					break;
    				}
    			}
    		}
    	}
    }
    
    void knotenAuflisten(void){
    	KnotenPtr_t hilfZeiger = anfang;
    	while( hilfZeiger != NULL ){
    		char out[16] = hilfZeiger->wort[16];
    		SerWrite(out, 16);
    		hilfZeiger = hilfZeiger->next;
    	}
    }
    
    int main(void){
    	while(1){
    		char wahl[2] = '\0';
    		char tmp[16];
    		SerWrite("-a- Neues Wort hinzufügen\n\r", 28)
    		SerWrite("-b- Wort löschen\n\r",19);
    		SerWrite("-c- Alle Worte auflisten\n\r",27);
    		SerWrite("Ihre Wahl:\n\r",13);
    		SerRead(wahl, 1,0);
    		if( strcmp(wahl, 'a') == 0){
    			neuerKnoten();
    			break;
    		}
    		else if(strcmp(wahl, 'b')==0){
    			SerWrite("Wort zum löschen:\n\r",20);
    			SerRead(tmp, 15,0);
    			loescheKnoten(tmp[16]);
    			break;
    		}
    		else if(strcmp(wahl, 'c')==0){
    			knotenAuflisten();
    			break;
    		}
    	}
    	return 0;
    }
    Nun zur Fehlermeldung:
    PHP-Code:
    "C:\ASURO_src\FirstTry\Test-all.bat" 

    C:\ASURO_src\FirstTry>make all 
    set 
    -eAVR-gcc -MM -mmcu=atmega8 -I. --Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.\
        | 
    sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' asuro.d; \
        [ -
    s asuro.] || rm -f asuro.d
          0 
    [mainsh 888 sync_with_childchild 5736(0x154died before initialization with status code 0xC0000142
      45612 
    [mainsh 888 sync_with_child: *** child state waiting for longjmp
    /usr/bin/shforkResource temporarily unavailable
    set 
    -eAVR-gcc -MM -mmcu=atmega8 -I. --Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.\
        | 
    sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' test.d; \
        [ -
    s test.] || rm -f test.d
          0 
    [mainsh 6852 sync_with_childchild 5140(0x154died before initialization with status code 0xC0000142
       6152 
    [mainsh 6852 sync_with_child: *** child state waiting for longjmp
    /usr/bin/shforkResource temporarily unavailable
    -------- begin --------
    AVR-gcc --version
    AVR
    -gcc (WinAVR 201001104.3.3
    Copyright 
    (C2008 Free Software FoundationInc.
    This is free softwaresee the source for copying conditions.  There is NO
    warranty
    not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    AVR-gcc --mmcu=atmega8 -I. --Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.-o test.o
    test
    .cIn function 'neuerKnoten':
    test.c:32warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:35warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:36error'wort' undeclared (first use in this function)
    test.c:36error: (Each undeclared identifier is reported only once
    test
    .c:36error: for each function it appears in.)
    test.cIn function 'loescheKnoten':
    test.c:45errorinvalid initializer
    test
    .c:45errorexpected ',' or ';' before 'else'
    test.c:50errorexpected '}' before 'else'
    test.c:44warningunused variable 'tmp'
    test.c:54errorexpected expression before ']' token
    test
    .c:54error: array subscript is not an integer
    test
    .c:54errorinvalid initializer
    test
    .c:55errorexpected expression before ']' token
    test
    .c:55error: array subscript is not an integer
    test
    .c:55error: array subscript is not an integer
    test
    .cAt top level:
    test.c:62errorexpected identifier or '(' before '}' token
    test
    .cIn function 'knotenAuflisten':
    test.c:67errorinvalid initializer
    test
    .c:68warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .cIn function 'main':
    test.c:75errorinvalid initializer
    test
    .c:77warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:78errorexpected ';' before 'SerWrite'
    test.c:79warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:80warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:81warningpointer targets in passing argument 1 of 'SerRead' differ in signedness
    test
    .c:82warningpassing argument 2 of 'strcmp' makes pointer from integer without a cast
    test
    .c:86warningpassing argument 2 of 'strcmp' makes pointer from integer without a cast
    test
    .c:87warningpointer targets in passing argument 1 of 'SerWrite' differ in signedness
    test
    .c:88warningpointer targets in passing argument 1 of 'SerRead' differ in signedness
    test
    .c:89warningpassing argument 1 of 'loescheKnoten' makes pointer from integer without a cast
    test
    .c:92warningpassing argument 2 of 'strcmp' makes pointer from integer without a cast
    make
    : *** [test.oError 1

    Process Exit Code2
    Time Taken00:01 
    So, jetzt seit ihr dran

    LG
    Spacy Bar

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Ich hab jetzt ehrlich gesagt keine Lust mich durch die ganzen Fehler zu wuseln, deshalb kriegste meine funktionierende Lösung. Kompiliert fehlerfrei und in meinem Test gabs auch keine Mem Leaks. Kann aber trotzdem Fehler enthalten.

    Gespeichert wird hier der Pointer auf einen String.

    Code:
    #ifndef LIST_H
    #define LIST_H
    
    
    
    
    typedef struct Node {
      char *dirpath;
      struct Node *pNext;
    } TNode;
    
    
    void Prepend(TNode **pList, char const *path);
    void Append(TNode **pList, char const *path);
    void Delete(TNode **pList, char const *path);
    void DeleteAll(TNode *pPath);
    
    
    
    
    #endif
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #include "list.h"
    
    
    
    
    /* Make new node */
    static TNode *MakeNode(char const *path) {
        TNode *const pNewNode = malloc(sizeof(*pNewNode));
    
    
        if(pNewNode == 0) {
            fprintf(stderr, "MakeNode(): No memory!\n");
        }
    
    
        if(1 > strlen(path)) {
            fprintf(stderr, "MakeNode(): Warning! Empty directory is inserted!");
        }
    
    
        pNewNode->dirpath = malloc(strlen(path)+1);
        strcpy(pNewNode->dirpath, path);
        pNewNode->pNext = 0;
    
    
        return pNewNode;
    }
    
    
    //add node at start
    void Prepend(TNode **pList, char const *path) {
        TNode *pNewNode = MakeNode(path);
    
    
            pNewNode->pNext = *pList;
            *pList = pNewNode;
    }
    
    
    //add node at end
    void Append(TNode **pList, char const *path) {
        TNode *pNewNode = MakeNode(path);
        TNode *pNode = *pList;
        TNode *pPrev = *pList;
    
    
        if(*pList == 0) {            //empty list
            *pList = pNewNode;
        }else{
            while(pNode != 0) {
                pPrev = pNode;
                pNode = pNode->pNext;
            }
            pPrev->pNext = pNewNode;    //catenation with the last new node
        }
    }
    
    
    void Delete(TNode **pList, char const *path) {
        TNode *pPrev = *pList;
        TNode *pNode = *pList;
    
    
        while(pNode != 0) {
            if(strcmp(pNode->dirpath, path) == 0) {
                    pPrev->pNext = pNode->pNext;
                    free(pNode->dirpath);
                    free(pNode); pNode = 0;
                    break;
            }
            pPrev = pNode;
            pNode = pNode->pNext;
        }
    }
    
    
    void DeleteAll(TNode *pPath) {
        TNode *pNode = 0;            //Pointer
    
    
        while(pPath != 0) {            //stop if end of list reached
            pNode = pPath;
            pPath = pNode->pNext;        //next node
            free(pNode->dirpath);
            free(pNode); pNode = 0;        //delete pointer and set to 0
        }
    }
    mfg

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Auch ich habe keine Lust das ganzen durch zu gehen. Aber hier solltest du es ein wenig mit reduzieren können.

    test.c:36: error: 'wort' undeclared (first use in this function)
    test.c:36: error: (Each undeclared identifier is reported only once
    test.c:36: error: for each function it appears in.)

    ...
    do { SerRead(wort[16] ,15,0);
    } while( getchar()!='\n');
    ...
    Die String "wort" besteht nicht in dem void Funktion "neuerKnoten". Es ist zwar als Teil von den Struktur "knoten" definiert. Aber das ist kein Speicherplatz.

    Code:
    struct knoten {
        char wort[16];
        struct knoten *next;
    };

    test.c: In function 'loescheKnoten':
    test.c:45: error: invalid initializer
    test.c:45: error: expected ',' or ';' before 'else'
    test.c:50: error: expected '}' before 'else'
    test.c:44: warning: unused variable 'tmp'
    void loescheKnoten(char txt[]){
    KnotenPtr_t hilfZeiger1;
    KnotenPtr_t hilfZeiger2;
    if(anfang != NULL){
    char tmp[] = anfang->wort //Hmm, gehört hier nicht ein ; und } wenn dannach ein else if-Zweich anfangt?
    else if( strcmp(txt[], tmp[]) == 0 ){ // [] ist nicht notwendig wenn du den gesamten Strings bedeutest. Hier oben aber schon.
    ...

  4. #4
    Benutzer Stammmitglied Avatar von Spacy Bar
    Registriert seit
    10.05.2014
    Beiträge
    34
    Tschuldige ich habe meine erste Fehlermeldung geposted. Ein paar Fehler hatte ich schon behoben.
    Jedoch Vielen Dank für die schnellen Antworten und die Codes.

    LG
    Spacy Bar

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Ich dachte mir, dass kann der Robby auch nur Zahlen sind witzlos, es müssen schon char-Arrays/Strings sein. Das ganze endete in einem Zeigergewirr mit Strukturgewirr verknüpft. Ich hoffe ihr habt eine Lösung für mein Problem, ich habe 'ne ganze menge Zeit rein investiert.
    ...
    So, jetzt seit ihr dran
    Du schaffst dir ein 'komplexes' Problem, weil eine einfache Lösung witzlos ist?!
    Dann bekommst du es nicht gelöst, es endet in einem Gewirr! Jetzt soll das Forum ran?

    Der war gut...

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Davon abgesehen: malloc zu verwenden ist auf so kleinen Plattformen wie dem AVR in der Regel keine gute Idee. Zum sind malloc und free "teuer" und zum anderen kannst du es früher oder später mit Speicherfragmentierung zu tun bekommen. In der Regel reicht eine statische Speicherreservierung aus, ist dabei einfacher und im Zweifelsfall auch zuverlässiger.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  7. #7
    Benutzer Stammmitglied Avatar von Spacy Bar
    Registriert seit
    10.05.2014
    Beiträge
    34
    Zitat Zitat von Sisor Beitrag anzeigen
    Du schaffst dir ein 'komplexes' Problem, weil eine einfache Lösung witzlos ist?!
    Dann bekommst du es nicht gelöst, es endet in einem Gewirr! Jetzt soll das Forum ran?

    Der war gut...
    Tut mir leid, das ist von dir falsch verstanden worden. Deswegen habe ich den Zwinker-Smiley dahinter gesetzt, damit es als Witz verstanden wird, das gilt in meinem Umfeld als absolute Entschuldigung.


    - - - Aktualisiert - - -

    Zitat Zitat von markusj Beitrag anzeigen
    Davon abgesehen: malloc zu verwenden ist auf so kleinen Plattformen wie dem AVR in der Regel keine gute Idee. Zum sind malloc und free "teuer" und zum anderen kannst du es früher oder später mit Speicherfragmentierung zu tun bekommen. In der Regel reicht eine statische Speicherreservierung aus, ist dabei einfacher und im Zweifelsfall auch zuverlässiger.[...]
    Das kann ich zum einen nachvollziehen, da der µC nur 1 kb RAM hat, zum anderen Funktionierte das Programm als Zahlenspeicher für den PC ebenfalls nur im Bereich unter einem KB (solange man keinen Zahlenwald darein gepflanzt hat).

    LG
    Spacy Bar

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Spacy Bar Beitrag anzeigen
    Das kann ich zum einen nachvollziehen, da der µC nur 1 kb RAM hat, zum anderen Funktionierte das Programm als Zahlenspeicher für den PC ebenfalls nur im Bereich unter einem KB (solange man keinen Zahlenwald darein gepflanzt hat).
    Das Problem der Speicherfragmentierung hat erst einmal nichts mit dem verfügbaren Speicher zu tun. Speicherfragmentierung entsteht, wenn im Adressraum einzelne Bereiche belegt sind und andere dazwischen frei. Wenn von den 1kB rechnerisch 50% frei sind kann es so trotzdem passieren, dass selbst ein malloc für 100 Bytes fehlschlagen kann, wenn kein zusammenhängender freier Speicherbereich >=100 Byte vorhanden ist. Ein solcher Flickenteppich im RAM entsteht dann, wenn du unterschiedlich große Speicherblöcke anforderst und der allozierte Speicher dann sehr unterschiedliche "Lebensdauern" hat.
    Ein Beispiel (Je Zeichen 64 Byte, + entspricht belegtem Speicher, _ entspricht freiem Speicher) bei dem nur noch Speicheranforderungen bis zu zwei Einheiten (128 Byte) möglich sind - Und wenn man das ganze auf Byte-Ebene betrachtet kann die Fragmentierung noch viel schlimmer werden:
    _+++__+__+_++_+_

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  9. #9
    Benutzer Stammmitglied Avatar von Spacy Bar
    Registriert seit
    10.05.2014
    Beiträge
    34
    Das Problem der Speicherfragmentierung hat erst einmal nichts mit dem verfügbaren Speicher zu tun. Speicherfragmentierung entsteht, wenn im Adressraum einzelne Bereiche belegt sind und andere dazwischen frei. Wenn von den 1kB rechnerisch 50% frei sind kann es so trotzdem passieren, dass selbst ein malloc für 100 Bytes fehlschlagen kann, wenn kein zusammenhängender freier Speicherbereich >=100 Byte vorhanden ist. Ein solcher Flickenteppich im RAM entsteht dann, wenn du unterschiedlich große Speicherblöcke anforderst und der allozierte Speicher dann sehr unterschiedliche "Lebensdauern" hat.
    Ein Beispiel (Je Zeichen 64 Byte, + entspricht belegtem Speicher, _ entspricht freiem Speicher) bei dem nur noch Speicheranforderungen bis zu zwei Einheiten (128 Byte) möglich sind - Und wenn man das ganze auf Byte-Ebene betrachtet kann die Fragmentierung noch viel schlimmer werden:
    _+++__+__+_++_+_
    Erstmal Danke für die Erklärung, von den Grundsätzen der Heap-Fragmentierung hatte ich zwar im C-Grundkurs von Jürgen Wolf schon gelesen, aber offensichtlich nicht richtig verstanden. Da stand etwas von Heap-Defragmentierung per Funktionsimplimentierung, allerdings kein Beispiel. Wenn du davon was verstehst, würde ich mich sehr über eine Erklärung freuen.
    Außerdem wurde die alternative Funktion alloca() erwähnt, mit der Speicher vom Stack angefordert wird. Wird sie genauso verwendet und macht sie in meinem Fall Sinn?
    Ich freue mich über jegliche erklärenden Antworten.

    LG
    Spacy Bar

  10. #10
    shedepe
    Gast
    Auf einem Mikrocontroller ist es viel sinnvoller sich einen Ringbuffer zu bauen als eine verkettete Liste. Dessen speicher kann man statisch allokieren. Problematisch wird es nur wenn man zwischen drin Daten einfügen will.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Liste Elektronikversand
    Von ihle im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 10.06.2014, 01:17
  2. Teil liste für UGV Robotter
    Von Chrischi Schmiedi im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 6
    Letzter Beitrag: 06.04.2013, 19:09
  3. Komponenten-Liste für Maturaarbeit
    Von nic3008 im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 17
    Letzter Beitrag: 08.03.2010, 19:22
  4. Roboter-Wettbewerbe/Infos für Liste gesucht
    Von Borg-Kubus im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 8
    Letzter Beitrag: 20.01.2010, 13:33
  5. Pinbelegungs Liste
    Von Da_Vinci13 im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 17.01.2009, 17:44

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen