Array größe ermitteln



  • Warum geht in CSharp was in C++ nicht möglich ist.

    In C++ gibt es keine Möglichkeit die Größe eines int array zu ermitteln.

    Wieso ist das in CSharp mit dem Attribut Length möglich aber in C++ nicht ?



  • blurry333 schrieb:

    Warum geht in CSharp was in C++ nicht möglich ist.

    In C++ gibt es keine Möglichkeit die Größe eines int array zu ermitteln.

    Wieso ist das in CSharp mit dem Attribut Length möglich aber in C++ nicht ?

    Klar geht das in C++ auch. Bei std::array und std::vector gibt es doch size(), das dir die Groesse zurueckgibt.

    Auch geht folgendes:

    int a[] = { 1, 2, 3, 4, 5 };
    	cout << "Size of a: " << sizeof(a)/sizeof(a[0]) << endl;
    

    Ich nehme an du meinst, dass man bei folgendem die Groesse nicht bestimmen kann:

    int* a = new int[3];
    

    Nun hier allozierst du ein Stueck Speicher, in dem drei Integer Platz haben (die liegen hintereinander im Speicher). Du setzt dann einen Zeiger auf das vorderste Element des Arrays (also des Speichers). Du hast also am Ende bloss einen Zeiger auf eine Speicherstelle - woher soll man jetzt herausfinden koennen wie gross dieses Stueck Speicher ist?

    Ich weiss jetzt nicht genau wie Arrays in C# genau implementiert sind. Aber wenn du in C# ein Array erzeugst, dann wird halt die Laenge des Arrays mitgespeichert usw.



  • Wieso geht das in CSharp aber nicht in C++;

    bzw wie müßte man es programmmieren damit es in C++ auch geht. Wie kann ich denn ein array zurückgeben. Meine Lösung einen Zeiger als Rückgabewert vorzusehen scheint nicht zu funktionieren.

    int* funk()
    {
    	int array[5]={1,2,3,4,5};
        return array;
    }
    
    int main()
    {
    
    	int arr[]; //array unbekannter Größe
    
    	arr = funk();
    
    }
    


  • Man kann das in C++ machen, indem entweder std::array oder std::vector braucht oder man halt selber eine Klasse Array implementiert.
    Ich wuerde dir davon abraten selber geschriebene Array Klassen zu verwenden und die STL zu nutzen. Genau dafuer ist sie da. Rohe Arrays braucht man in C++ sowieso kaum - die braucht man in C.

    Hier mal eine Idee wie man das in etwa nachbauen koennte:

    #include <iostream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    class Array
    {
    private:
    	int* _arr;
    	size_t _length;
    
    public:
    	Array( size_t length )
    		: _arr(new int[length]), _length(length)
    	{}
    
    	~Array()
    	{
    		delete[] _arr;
    	}
    
    	int& operator[]( size_t index )
    	{
    		return _arr[index];
    	}
    
    	size_t length() const
    	{
    		return _length;
    	}
    };
    
    int main()
    {
    	Array arr( 3 );
    	for ( size_t i = 0; i < arr.length(); ++i )
    		arr[i] = i * i;
    
    	for ( size_t i = 0; i < arr.length(); ++i )
    		cout << arr[i] << endl;
    }
    

    Die Klasse Array habe ich jetzt nur so schnell hingeschrieben um dir eine Idee zu geben wie man das in etwa implementiren koennte. Da fehlt einiges wie z.B. ein selbstgeschriebener Copy Constructor und noch vieles mehr 😉



  • Ihr habt ja eine Ausdauer 😮

    http://www.c-plusplus.net/forum/291339



  • Ich glaube, er will den schmutzigen Weg:

    int* funk()
    {
        int* array = new int[5](); // aggregate initialization geht hierbei leider nicht.
        return array;
    }
    
    int main()
    {
    	int* arr = funk();
    	delete[] arr;
    }
    

    Die Frage - who deletes that object? - musst du dir natürlich selbst beantworten.



  • blurry333 schrieb:

    Warum geht in CSharp was in C++ nicht möglich ist.

    CSharp ist eine andere Programmiersprache als C++.

    blurry333 schrieb:

    In C++ gibt es keine Möglichkeit die Größe eines int array zu ermitteln.

    Das stimmt so nicht ganz.

    blurry333 schrieb:

    Wieso ist das in CSharp mit dem Attribut Length möglich aber in C++ nicht ?

    CSharp ist eine andere Programmiersprache als C++. C++ basiert auf C und ist damit größtenteils kompatibel. In C ist ein Array auch nur eine Ansammlung gleichartiger Objekte, ohne dass da irgendwo noch Metadaten über die Länge versteckt sind (passt zum "zero overhead principle"). CSharp hat ein völlig anderes Design. Da ist eine "Variable eines Array-Typs" in Wirklichkeit ein "fat pointer", der auf das erste im Heap allozierte Objekt zeigt und zusätzlich die Länge des Arrays speichert (daher "fat"). Diese Indirektion gibt es in C und C++ gar nicht im Sprachkern bei rohen Arrays. C++ ist aber mächtig genug, dass man sich so etwas nachbauen kann. Da kommt dann std::vector<> bei raus. Bei rohen C Arrays ist wenigstens die Längeninformation in Form des Typs bekannt, weil die Länge ja auch zur Compile-Zeit feststehen muss. Hier meine ich mit C-Arrays so etwas wie T[N] und nicht T*. Letzteres ist nur ein Zeiger. Jegliche Längeninformation ist da schon verloren gegangen, weil ein roher Zeiger nur eine Adresse und nicht mehr speichert. Das hat alles schon so seine Richtigkeit unter den gegebenen Umständen und Designzielen von C++.

    Dein "C++" Code ist immer noch echt Müll. Lass es doch einfach sein und bleib bei CSharp.



  • blurry333 schrieb:

    In C++ gibt es keine Möglichkeit die Größe eines int array zu ermitteln.

    Neben der Tatsache das du eig. blurry333 bist, geht es mit einem echten Array (also keinem Zeiger) so:

    int arr[5];
    
    size_t sizeOfArr = sizeof(arr) / sizeof(*arr);//Wäre arr nur ein Pointer, könnte bspw. (ist Plattformabhängig) 1 rauskommen...
    

    Allerdings gibt es geniale STL-Container, die sich die Größe eines Arrays merken können (!) und dazu noch viele Member-Funktionen bieten.
    Wie immer: GIYF.

    @icarus: Meine Güte.... geht das nicht wenigstens mit Templates? 🙄

    int* funk()
    {
        int* array = new int[5](); // aggregate initialization geht hierbei leider nicht.
        return array;
    }
    
    int main()
    {
    	int* arr = funk();
    	delete[] arr;
    }
    

    Das Problem hier sind die Magic Constants. Er muss selbstverständlich vorher die Größe des Arrays wissen, da diese dann zur Laufzeit (in der main()) nicht mehr vorhanden ist.... dann wenigstens mit Templates...



  • Hacker schrieb:

    @icarus: Meine Güte.... geht das nicht wenigstens mit Templates? 🙄

    Du hast wohl auch kein Hobby ausser dich den ganzen Tag zu beschweren 🙄

    Wenn er offensichtlich schon nicht versteht wie Pointer funktionieren, dann sollte man natuerlich gleich mit Templates kommen - moeglichst kompliziert, das ist immer gut.



  • Jungs, dieser Typ stellt seit über zwei Jahren unverändert Fragen, deren Antworten jeder interessierte C++-Anfänger nach spätestens zwei Monaten aus dem FF wüsste. Es handelt sich ganz offensichtlich um einen Troll.



  • krümelkacker schrieb:

    Dein "C++" Code ist immer noch echt Müll. Lass es doch einfach sein und bleib bei CSharp.

    Hast Du schonmal seinen C#-Code gesehen?




  • Ich weiss was du meinst 🙂
    Aber was sollen wir ihm dann vorschlagen? Dass er beim Strassenkehren bleiben soll?


Anmelden zum Antworten