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



  • Hi,

    ich habe ein Problem, ich will wissen wieviele Einträge das Array hat wenn ich es an meine Funktion gebe:

    float x[16];
    
    // [...]
    
    int func (float *value)
    {
    		// Teste ob Value _genau_ 16 einträge hat
    	if (!(abfrage ob 16 einträge))
    	{
    		return -1;
    	}
    
    	// [...]
    }
    

    Nun wie macht man so eine Abfrage um rauszufinden ob value nun wirklich genau 16 Einträge hat?

    schon mal Danke im voraus!!! 🙂



  • Geht nicht. Entweder du nimmst einen std::vector (Größe mit vec.size() ),
    oder du übergibst noch eine Variable an die Funktion, die die Länge enthällt.



  • Ginge das nicht evtl. so?

    sizeof(value)/sizeof(float)
    


  • Nein



  • gibt es echt keine Möglichkeit außer STL oder ner zusatz variable???? verdammter mist....



  • Es gibt noch ne Möglichkeit... so wie die C-Strings das machen. Ein besonderer Eintrag markiert das Ende. Aber das wirst Du wohl auch nicht wollen.



  • 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.


Anmelden zum Antworten