in einer funktion die länge eines übergebenen arrays ermitteln...



  • Hi, ich bin noch recht neu in C und stoße mit meiner verrauchten rübe gerade vor ein problem, das ich mir nicht selbst erklären kann, und darum um euren kurzen Zeitaufwand bitte, mir jenes zu erläutern ;):

    Ich möchte eine Funktion schreiben, bzw. hab sie geschrieben, um einen Text animiert auszugeben, aber ich schaffe es nicht, die größe des arrays text[] innerhalb der funktion mit sizeof() zu ermitteln; das heißt, also nachdem es übergeben wurde:

    void machinetext(char * array, int x, int y, int dly){ 
        int i=0; 
        while(i<sizeof(array)){ //hier gibt sizeof() den wert 4 zurück, 
                                //sollte aber 10 sein. mit *array ist der 
                                //Wert 1... 
            gotoxy(x,y);                 
            printf("%c",array[i]);       
            if (array[i]!=' ') _beep(1000,1); 
            _sleep(dly); 
           i++; 
           x++; 
          } 
    } 
    
    void main(){ 
       char text[10]={'T','E','S','T','S','T','R','I','N','G'} 
       machinetext(text,15,15,50); 
       getchar(); 
    }
    

    wie ermittle ich nun innerhalb der funktion machinetext die länge des arrays text[]??

    Many Thanx schonmal im Voraus
    dUkE



  • derduke schrieb:

    wie ermittle ich nun innerhalb der funktion machinetext die länge des arrays text[]??

    Garnicht. Das ist leider unmoeglich.



  • hmm.. das ist schlecht, hat jemand ne idee, we man das realisieren kann? ich meine im prinzip muss es doch kein problem sein, die grösse von dem zu ermitteln, auf das ein Pointer zeigt... nur ich hab da grad irgendwie nen typisches Newbie-Brett vorm kopf, denke ich... 😕



  • Am besten die Länge als zusätzlichen Parameter mit übergeben.

    Die Länge eines Bereiches auf den ein Poiinter zeigt zu ermittlen ist soviel ich weiß nicht ohne weitere möglich, wie auch?



  • Du kannst als letzten Buchstaben des strings ein '\0' machen. Ich glaub das geht auch automatisch, wenn du text[] so initialisierst:

    text[] = "TESTING";
    

    dann kannst du die länge des strings ganz einfach mit

    int laenge = strlen(array);
    

    bin mir nicht 100 % sicher aber eingentlich sollte es so gehen...



  • Könnte man nicht mit sizeof(Array[0]) die Groeße eines einzelnen Elements ermitteln und dann sizeof(Array) durch diesen Wert teilen ??? Zumindest prinzipiell erscheint mir das ganze rel. logisch. Aber vielleicht irre ich mich da auch ?
    Gruß
    E-the-Real



  • Das geht nur solange der Array wirklich den Typ T[n] hat. Übergibt man den Array einmal z.B. als Funktionsparameter mit dem Typ T*, ist sizeof(array) == sizeof(T*) == Größe des Zeigers.



  • Oder man ersetzt das durch std::vector<T> ...



  • @op.void: ja, hast recht. ich dachte irgendwie gleich an ein int-array, also nix mit zeigern...aber es geht ja um char* , das is dann nat. blödsinn...



  • Wie wäre es, dem String wie gewohnt den '\0' zu verpassen. Dann noch ne while - Schleife bis zum '\0', mitzählen lassen und fertig.

    MfG



  • Wenn auch garantiert nur das letzte Element '\0' ist, ist das natürlich möglich. Bei einem char* Array verwende dann aber strlen.



  • Man könnte natürlich auch einfach einen std::string nehmen =).

    Könnte man nicht mit sizeof(Array[0]) die Groeße eines einzelnen Elements ermitteln und dann sizeof(Array) durch diesen Wert teilen ???

    sizeof(Array[0]) = sizeof(char) = sogut wie immer 1 ^^



  • Fals compile-time Info über ein array verfügbar ist, sprich global oder auf dem stack ist, dann kannst du diese auch nutzen:

    template<int len>
    void func(char a[len])
    {
         //len is nun eine compile-time Konstante die die Länge eines Arrays enthält
    }
    

    Allerdings wenn du versuchst ein dynamisches Array an solch eine Funktion zu übergeben, dann kriegst du ein compile-time error. Wenn du allerdings noch zusätzlich eine func(char*a) überläds dann wird diese in dem Fall aufgerufen.

    Was ich oft mache wenn ich mit char Arrays arbeite (und nicht mit std::string) ist folgendes:

    void func(char*str,int len)
    {
         //mach was
    }
    template<int len>
    inline func(char str[len]){
         func(str,len-1);//-1 wegen des \0
    }
    inline func(char*str){
         func(str,strlen(str));
    }
    

    Hiermit fällt sofern möglich der strlen overheat weg.

    Die Sache hat allerdings einen Hacken. Leider muss die Grösse der Arrays nicht der Länge des Arrays entsprechen, Stichwort gefüllter Buffer. Für den Fall muss man das Array zu einem char* casten um dies explicit auszudrücken.
    Allerdings wenn man viele Konstructionen wie

    func("Hello");
    

    hat dann lohnt es sich aber.



  • joa, das hab ich letztendlich auch gemacht, nach dem sizeof() dort kein sinn mehr hatte :))

    viele viele thx ppl 🙂

    peace duke...



  • ich füge meinem letzten beitrag folgendes hinzu: @Saiyamann :))


Anmelden zum Antworten