Rausfinden wie groß das Array bei übergabe an Funktion?



  • Vor einer Woche gab's die gleiche Frage, vielleicht etwas ausführlicher beantwortet:
    http://www.c-plusplus.net/forum/viewtopic.php?t=64260
    Gruß
    E-the-Real



  • Wenn du folgenden code hast: float p[4]; und du sizeof(p); machst so ist dies
    nicht anderes wie wenn du nach sizeof(float *); fragen würdest.
    Am besten ist der std::vector und auch wenn du es nicht glaubst, er ist genauso
    schnell wie nen normales Array, den ganzen overhead hast du ja auch, wenn du es
    selbst von hand machst.



  • SirLant schrieb:

    Wenn du folgenden code hast: float p[4]; und du sizeof(p); machst so ist dies
    nicht anderes wie wenn du nach sizeof(float *); fragen würdest.

    Falsch, sizeof(p) ist hier 4 * sizeof(float). Solange du den Array nicht durch eine float*-Variable oder einen float[]-Parameter ansprichst, funktioniert das problemlos.
    Eine Lösung, die *nur* in diesen sicheren Fällen funktioniert, einen Zeiger aber im Gegensatz zu der sizeof/sizeof-Lösung nicht annimmt, ist:

    template<typename T, std::size_t Len>
    std::size_t lengthof(const (T&)[Len])
    {
        return Len;
    }
    


  • ich sollte vieleicht noch dazu schreiben das es in meinem Programm keine STL header gibt, da ich sie eigentlich nicht benötige.

    aber das mit sizeof/sizeof würde gehen oder??



  • #include <iostream>
    
    using namespace std;
    
    float x[16];
    
    float test (float *value)
    {
    		// Wieso funzt das hier nicht=????
    	return (sizeof(value)/sizeof(float));
    }
    
    int main (void)
    {
    	cout << sizeof(x)/sizeof(float) << endl; // Hier kommt 16
    	cout << test(x) << endl; // hier kommt 1??????????????????????????
    }
    

    wieso?



  • sizeof hilft dir null, weil sizeof(value) == sizeof(float*) - value und x haben unterschiedliche Typen, und durch die Konvertierung in float* geht die Längeninformation verloren.
    Alternative Lösungen stehen hier einige, und <vector> ist IMHO die sicherste davon. Deine Begründung gegen die STL klingt nicht gerade überzeugend. es geht beim Programmieren nicht darum, möglichst wenig funktionierenden Code wiederzuverwenden... 🙄



  • nein aber ein Programm ohne stdlib ist ein Argument, weil ich es für eine Bootdisk-Programm schlecht benutzen kann, gell? 😉



  • kurz: ich brauche eine Low-Level variante!



  • dann übergib die Länge als Parameter mit. Wobei ich trotzdem nicht verstehe, warum für ein Programm auf einer Bootdisk keine STL verwenden kann... aber ich muß auch nicht alles verstehen.

    Jedenfalls kann eine Lösung mit sizeof nicht funktionieren, weil sizeof zur Compile-Zeit ausgewertet wird. Das heißt, die Größe des Feldes müßte bereits dann feststehen. Tut sie aber bei einer Funktion, die eines übergeben krieg nicht. Und erst recht nicht, wenn das Feld erst zur Laufzeit angelegt wird.

    MfG Jester



  • mist: kurz es gibt KEINE andere lösung als die mit nem 2. Parameter wo man die größe angibt??



  • Du kannst deine eigene Array-Klasse schreiben. Dann nimm aber lieber doch gleich std::vector.
    Wenn du keine STL verwenden kannst, dann ist das IMO auch kein C++. Man sollte Standard-C Arrays wenn es geht, nicht verwenden.



  • Oder schau mal bei boost vorbei. Da gibts auch ein paar nette Sachen.
    vector bringt halt schon ne ganze Menge Zusatzlast mit. Speicher ist dynamisch, kann also wachsen. Wenn das aber unnötig ist, dann ist es unter umständen verschwendete Energie.
    boost::array wäre in diesem Fall wohl eine Alternative.

    MfG Jester



  • @isak: du kannst auch einfach nen \0 nach dem letzten element einfügen, so wie bei char arrays auch(wenn sie als string genutzt werden).

    dann musste dir nur noch ne funtion schreiben die dir die länge zurückgibt..

    allerdings ist die lösung mit einem zweiten parameter oder einer array-klasse auf jeden fall weniger rechenaufwendig.



  • Wo kann man gleich nochmal nachlesen, was von boost jetzt in die STL übernommen werden soll?
    Suchfunktion geht grad nicht. 🙄

    Ich hoffe mal, es sind array und lexical_cast (oder stattdessen mehr Konstruktoren für string) dabei.



  • damnit, könnt ihr nicht lesen? KEINE STL! Ein bootprogramm kann schlecht auf die eingebundene c++ stdlib des OS zugreifen wenn noch keines da ist!!!!

    Kurz geht nicht, okay ciao



  • Bevor Du jetzt hier rumkrakeelst würd ich Dir empfehlen Dich erstmal zu informieren:

    www.boost.org hat nix mit STL zu tun. Und boost::array ist wahrscheinlich genau das was Du suchst.

    Daß einige der dortigen Bibliotheken als Vorschlage für die nächste Standard-Lib (C++0x) vorgeschlagen sind sollte Dich eigentlich nicht stören, oder?

    Wieso ist das ein Problem, wenn noch keine Lib da ist? Der Code von vector liegt doch direkt im Source vor und wird für das Projekt mitübersetzt. Da wird nicht auf ein spezifisches Betriebssystem zugegriffen...

    @Optimizer:
    Noch mehr neue Members für string wird es sicher nicht geben. Aber lexical_cast<> ist meines Wissens dabei.

    MfG Jester



  • Wenn man keine Teilarrays übergeben will, wäre noch eine Lösung, die ich hier gerade nirgends sehe:

    void funktion(const int (&foo)[123])
    {
    }
    

    Diese Funktion nimm jetzt nur einen int[123] an.



  • operator void schrieb:

    Wenn man keine Teilarrays übergeben will, wäre noch eine Lösung, die ich hier gerade nirgends sehe:

    void funktion(const int (&foo)[123])
    {
    }
    

    Diese Funktion nimm jetzt nur einen int[123] an.

    thx


Anmelden zum Antworten