Variadic Function ohne Parameteranzahl



  • Wurstinator schrieb:

    Auch wenn es sich gut tarnt, übergibst du dort kein Array, sondern nur einen Zeiger - und auf den angewendet gibt dir sizeof() keine praktisch verwertbare Angabe.

    Hä? Du hast doch ein paar Beiträge vorher gesagt, sizeof(vals) wäre die Größe des Arrays (in Bytes).

    Da bin ich wohl mit deinem Bezeichnern durcheinandergekommen - sizeof() liefert die Größe des angegebenen Ausdrucks. Bei einem echten Array ist das dessen Gesamtgröße (Elementzahl*Elementgröße), bei einem Zeiger (inklusive "Array"-Parameter) idR 4 oder 8 je nach Betriebssystem.



  • Wurstinator schrieb:

    Hä? Du hast doch ein paar Beiträge vorher gesagt, sizeof(vals) wäre die Größe des Arrays (in Bytes).

    Zeiger und Array sind leicht unterschiedlich: sizeof(Ptr) liefert den Speicher des Zeigers zurück (auch wenn er auf ein Array zeigt) und sizeof(Arr) liefert den Speicher eines Elementes mal die Anzahl Elemente.

    EDIT: Mal wieder zu lahm 🙄



  • Und was ist ein "echter" Array?



  • Wurstinator schrieb:

    Und was ist ein "echter" Array?

    int EchtesArray[15];
    int* KeinEchtesArray = new int[15];
    int* AuchKeinEchtesArray = EchtesArray;
    


  • Du hast ein "echtes" Array dort in der Hand, wo du es als Array definiert hast. Dazu gehört z.B. der Klassenmember VTYPE values[DIM]; . Dort weiß der Compiler noch, daß er ein Array hat (und wie groß es ist), also kann er auch damit umgehen.


  • Mod

    unechte Zeiger? ganz ganz echte Arrays?

    Es ist viel einfacher:

    Zeiger, Arrays, Zeiger, Arrays... bitte nicht mit irgendwelchen Qualifikationen verwirren, die hier keinen Platz haben. Der Compiler macht ganz sicher nicht so feine Unterschiede.



  • camper schrieb:

    unechte Zeiger? ganz ganz echte Arrays?

    Es ist viel einfacher:

    Zeiger, Arrays, Zeiger, Arrays... bitte nicht mit irgendwelchen Qualifikationen verwirren, die hier keinen Platz haben. Der Compiler macht ganz sicher nicht so feine Unterschiede.

    Nur weil DU noch nie von echten und unechten Arrays gehört hast, heißt das noch lange nicht, dass es sie nicht gibt!



  • Also ein echter Array ist ein solcher, bei dem der Compiler die Größe kennt?

    void funktion(int array[]); // ein Zeiger
    void funktion(int array[3]); // ein Array?
    


  • Wurstinator schrieb:

    Also ein echter Array ist ein solcher, bei dem der Compiler die Größe kennt?

    Ja

    void funktion(int array[]); // ein Zeiger
    void funktion(int array[3]); // ein Array?
    

    Nein - das gehört zu den Erbschaften von C, daß hier die Größenangabe nicht beachtet wird und biede Funktionen einen Zeiger übergeben bekommen.



  • Manchmal mag man die Erbschaft so umgehen:

    template<unsigned int DIM, class VTYPE>
    Vektor<DIM, VTYPE>::Vektor(VTYPE (&vals)[DIM])//nur aufrufbar, wenn die Größe stimmt
    {
        memcpy(values, vals, sizeof(vals));//dann klappt's auch mit dem sizeof
    }
    


  • Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡



  • Nexus schrieb:

    Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡

    Erbschaft umgehen? Du solltest Dir eine andere Programmiersprache suchen!



  • Olga schrieb:

    Nexus schrieb:

    Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡

    Erbschaft umgehen? Du solltest Dir eine andere Programmiersprache suchen!

    Es gibt auch eine C++-Schule, die anfängt mit
    std::string filename("autoexec.bat");
    und nullterminierte char-arrays außerhalb string-Initialisierungen leugnet.
    Ich bin kein Freund davon. Aber es klappt. Und ist auch in vielerlei Hinsicht schneller, als zu fast allen Sprachen zu wechseln, die Strings als Sprachbestandteil haben.



  • Gewisse C-spezifische Dinge bringts schon. Zeiger und Makros zum Beispiel (ja, Makros). Aber bei Arrays, wo wir mit std::array die gleiche Funktionalität viel besser verpackt haben (Wertsemantik, keine implizite Zeiger-Konvertierung, STL-Interface, Assertions für Indexzugriff), sehe ich keinen Grund, an Antikem festzuhalten.



  • Und wie soll ich einen std::tr1::array als Parameter übergeben, wenn die Arraygröße variabel sein soll?



  • Wurstinator schrieb:

    Und wie soll ich einen std::tr1::array als Parameter übergeben, wenn die Arraygröße variabel sein soll?

    Mach die Funktion halt eben zu einer Template-Funktion.



  • Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃



  • Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?



  • Shade Of Mine schrieb:

    Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?

    Einen Fehler. Er will sich selbst keine Fehler antun.



  • Shade Of Mine schrieb:

    Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?

    Den Konstruktor?!
    Ich hab es nur kurz gegooglet und nicht ausprobiert; wenn es falsch ist, hättest du mir ja einfach die richtige Variante sagen können.


Anmelden zum Antworten