Wieviel elemente im Array???



  • Hallo, ich habe folgenden Code:

    #include <stdio.h>
    #include <string.h>
    
    char plus(char * str[]);
    
    int main(void)
    {
       char *string[] = {"Name1", "Name2"};
    
       plus(string); 
    
       printf("Insgesamt %i Eintraege\n\n",      ); //Was muss hier hin??
    
       printf("Eintrag 3 ist: %s",string[2]);
       getch();
       return 0;
    }
    
    char plus(char *str[])
    {
      str[2] = "Name3";         
    }
    

    Wie bekomm ich jetzt raus, wieviel einträge drin stehn??

    Gruß Michael



  • CaPGeti schrieb:

    Wie bekomm ich jetzt raus, wieviel einträge drin stehn??

    in der Funktion plus gar nicht, die Anzahl musst du dann übergeben.

    Das ist eine Schwäche von Zeigern auf Arrays, du kannst ihre Länge nicht ermitteln sondern musst du sie dir immer merken.

    Außerdem ist deine plus Funktion falsch, denn du schreibst außerhalb der Grenzen des Arrays. Ein statischs Array kannst du nämlich nicht vergrößern/verkleinern. Dafür musst du man: malloc(3)/man: realloc(3) nehmen.



  • manno....Aber was ist wenn ich nicht weis wie viele elemente es sind?
    mist, jetzt muss ich doch ne liste erstellen 😞
    Danke für den tipp.



  • Wieso musst du eine Liste erstellen?

    wenn du dein Array schreibst, weißt du doch wie viele Elemente es sind...

    #define MY_NUMBER 2
    char const *my_array[MY_NUMBER] = {"hello", "world"};
    


  • Dort, wo Du ein automatisches Array erstellst, weißt Du immer, wieviele Elemente es sind. Diese Anzahl musst Du halt mitschleppen. Wenn Du ein dynamisches Array erstellst, musst Du die Anzahl sogar vorgeben. Dann weißt Du sie also auch.

    Mit automatischem Array meine ich lokale oder globale Arrays (gilt natürlich auch für static global und static lokal), die nicht nur als Zeiger vorhanden sind, wie in:

    // global
    int ary[] = { 0, 2, 4, 6, 8 };
    
    int main()
    {
        // lokal
        char str[] = "Hallo, Welt";
    
        size_t ary_len = sizeof ary / sizeof *ary; // == 5
        size_t str_len = sizeof str / sizeof *str; // == 12 Achtung: entspricht strlen(str)+1!
    
        func(ary, ary_len); // hier würde die Information verlorengehen, wenn Du sie nicht mitschleppst!
    }
    
    int func(int pary[], size_t pary_len)
    {
        // hier ist sizeof(pary) immer == sizeof(void*)
    }
    


  • ^^man könnte deshalb den 'objektorientierten' ansatz nehmen und pointer und längenangabe in einer struct zusammenfassen, die dann herumgereicht wird.
    🙂



  • ah stimmt...kann man ja mitzählen, wenn die daten aus ner datei kommen.
    Ich habe jetzt aber ein anderes Problem. Ich versuch grad ne einfach verkettete liste zu erstellen, aber bei meiner funktion für das einfügen eines elements in die liste treten komische fehler auf:
    1. Wenn ich speicher mit malloc hohle gebe ich ihn danach mit free wieder frei ->aufhänger (aber nur, wenn die daten > 2 zeichen sind (hää?)

    2. wenn ich free weglasse und danach ins menü zurückgeh funktioniert system("cls"); nicht mehr. weis einer warum???

    Hier der code. (Er ist noch nicht fertig, da ich ja diese Probleme habe)

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    
    struct list
    {
           char *vname;
           char *nname;
    
           struct list *next;       
    };
    
    struct list *leer = NULL;
    
    void addPerson(char *vname, char *nname);
    
    void addPerson(char *vnamen, char *nnamen)
    {
        struct list *pointer;
    
        pointer = (struct list *) malloc(sizeof(struct list)); 
    
        strcpy(pointer->vname, vnamen);
        strcpy(pointer->nname, nnamen);
    
        pointer->next = leer;
        leer = pointer;  
    
        //free(pointer);
    }
    
    int main()
    {
        int i;
        char vorname[100];
        char nachname[100];
    
        do{
            system("cls");
            printf("\n\t1< Neuer Eintrag\n\n\t2< Eintrag suchen\n\n\t3< Alle Anzeigen\n\n\t4< Beenden");
    
            i = getch();   
            if(i==49) 
            {
                      system("cls");
                      printf("\n\n\n\tVorname: ");gets(vorname);
                      printf("\n\tNachname: ");gets(nachname);
                      addPerson(vorname,nachname); 
                      system("cls"); 
            }
    
            if(i==50) {sucheeintrag();system("cls");}
            if(i==51) {allesanzeigen();system("cls");}
            if(i==52) {return 0;}
    
            i = 0;
        }while(i!=52);
    }
    int sucheeintrag()
    {
        return 0;
    }
    int allesanzeigen()
    {
        return 0;
    }
    

    Vieleicht hab ich ja blos was falsch deklariert???

    PS: Warnung: verschont mich aber mit halbwissen und son zeugs, das hat ich erst letztens in einen anderem forum, als ich ein Problem mit dem Speichern einer datei (Javascript) hatte, die richtige lösung kam 3 seiten danach und war = cookies. 2 einhalb seiten haben die mich zugetextet, das ich nur halbwissen habe und viele wissenslücken. Ich mein, wenn ich ein "Hello world" Programm zum ersten mal in eine neue Sprache schreibe, muss ich doch nicht wissen wie genau das funktioniert. Oder habt ihr das bei c/c++ genau gewusst?

    Gruß ^^



  • du solltest die pointer^^ in deiner struct auch auf etwas zeigen lassen, damit die strcpys ein ziel haben. oder du machst arrays daraus.
    🙂



  • mist... -.-

    Auf was kann ich sie denn zeigen lassen??? mir fällt da nichts ein. ^^



  • irgendwie so:

    struct list* addPerson(char *vnamen, char *nnamen)
    {
        struct list *pointer;
    
        list = malloc(sizeof(struct list));
        if (list)
        {
            list->vname = malloc (MAX_NAME);
            if (list->vname)
            {
               strncpy (...);
               ...
            }
        }
        ...
        return list;
    }
    

    und zum löschen sowas ähnliches:

    void delete_person (struct list *p)
    {
       // erst p aus liste austragen und dann...
       ...
       free (p->vname);
       free (p->nname);
       free (p);
    }
    

    🙂


Anmelden zum Antworten