Funktions verhalten?



  • Guten abend,
    ich möchte eine Funktion schreiben, welche sich je nachdem ob der parameter ein array ist oder nicht anders verhält. In anderen Worten möchte ich eine möklichkeit wie ich abfragen kann ob eine Variable ein Array ist oder nicht. String ist der datentyp, dieser bleibt auch immer gleich.
    Wie kriege ich sowas hin?

    Danke schonmal im voraus



  • TheJoker schrieb:

    Guten abend,
    ich möchte eine Funktion schreiben, welche sich je nachdem ob der parameter ein array ist oder nicht anders verhält. In anderen Worten möchte ich eine möklichkeit wie ich abfragen kann ob eine Variable ein Array ist oder nicht. String ist der datentyp, dieser bleibt auch immer gleich.
    Wie kriege ich sowas hin?

    Danke schonmal im voraus

    Eine Funktionsüberladung bzw. Templates könnten das schön lösen.



  • template <typename T>
    void GetVar(const T &var)
    {
        std::cout<< typeid(var).name() <<std::endl;
    }
    


  • 11 Sekunden, wie l33t-mäßig 😃


  • Mod

    Das machst du indem du die Funktion überlädst:

    void foo(Datentyp bar)
    {
       // Normalfall
    }
    
    void foo(Datentyp* bar);  
    {
       // Parameter war ein Array
    }
    

    Kóyaánasqatsi schrieb:

    11 Sekunden, wie l33t-mäßig 😃

    Mach dir nichts draus, ich war noch langsamer 😞 .



  • Vielen dank für die schnellen antworten.
    eine frage habe ich jedoch..
    Wieso ist hier ein Stern zur differenzierung des falles verwedet worden?

    void foo(Datentyp bar)
    {
       // Normalfall
    }
    
    void foo(Datentyp* bar);  
    {
       // Parameter war ein Array
    }
    

    muss das nicht so ausehen?

    void foo(Datentyp bar)
    {
       // Normalfall
    }
    
    void foo(Datentyp bar[]);  
    {
       // Parameter war ein Array
    }
    

    ich bin nicht mehr ganz so neu in c++ und weiß das Sterne im normallfall einen Zeiger einleiten... deswegen verschtehe ich das nicht ganz...



  • Arrays sind quasi nichts anderes als eine Art mehrerer Werte, die im Speicher hintereinander liegen.
    Deshalb ist folgendes Beispiel valid und erklärt, warum das funktioniert:

    int array[] = { 8, 9, 10, 11, 12 };
    
    // "normaler" Zugriff
    int x = array[0]; // 8
    int x = array[1]; // 9
    int x = array[2]; // 10
    int x = array[3]; // 11
    int x = array[4]; // 12
    
    // Pointer-Zugriff (nicht verwenden wenn normaler Zugriff verfügbar!)
    int x = *(array + 0) // 8
    int x = *(array + 1) // 9
    int x = *(array + 2) // 10
    int x = *(array + 3) // 11
    int x = *(array + 4) // 12
    
    // (array + 0) ist also = array, d.H. array ist der Beginn der Speicherstelle im Speicher (= Pointer auf das 0. Element)
    // Das ist auch der Grund warum man die Länge von Arrays in C manuell mitgeben muss, denn...
    // array[5] oder *(array + 5) würden vermutlich crashen bzw. undefiniertes Verhalten bzw. komische Werte aufrufen
    

    Ich hoffe ich liege mit meiner Erklärung richtig!

    Edit: Bei char* -Arrays wird meistens nicht die Anzahl der Elemente (= Länge des Strings) per Parameter mitgegeben, sondern das letzte Element (Zugriff via Länge des Strings) beinhaltet das Zeichen '\0' , was anzeigt, dass der String hier zu Ende ist. Fehlt das, so können Funktionen wie std::strcpy etc. crashen. Dafür gibt es dann sichere(re) Funktionen wie std::strncpy .

    Gruß



  • (array+5) ist falsch.

    array[5] und *(array+5) sind identisch.

    Weitere Informationen: http://c-faq.com/aryptr/index.html



  • Sorry. Meinte ich doch. Korrigiert 😉

    Gruß



  • theliquidwave schrieb:

    (array + 0) ist also = array, d.H. array ist der Beginn der Speicherstelle im Speicher (= Pointer auf das 0. Element)

    Genau genommen ist array ein Array und kein Zeiger. Jedoch können Arrays implizit in Zeiger auf das erste Element des Arrays konvertiert werden. Deshalb kann man einer Funktion, die ein char* nimmt, auch ein char -Array übergeben; oder deshalb kann man + oder [] auf Arrays anwenden.


Anmelden zum Antworten