Arraygröße nachträglich verändern



  • Meine Problematik: Ich brauche im haupt-programmablauf ein Array, welches erst in einer aufgerufenen Methode (welche sich wiederrum in einer anderen Klasse befindet) in seiner größe definiert und beschrieben wird. Das ganze soll funktionieren, ohne das Array kopieren zu müssen. Ich hab das ganze mal versucht, indem ich es im hauptprogramm anlege, einen zeiger auf das array an die Methode weitergebe und erst in der methode initialisiere ... aber dabei kommt nur nen ungültiger pointer bei raus. Wie würde man das nun tun, wenn man wüsste WAS man tut? 😃

    unsigned char* myarray;// = new unsigned char[8];
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	myclass* test = new myclass(myarray);
    	test->fill();
    
    	return 0;
    }
    
    unsigned char* a;
    
    myclass::myclass(unsigned char* iarray)
    {
    	iarray = new unsigned char[16];
    	a = iarray;
    }
    
    int myclass::fill()
    {
    	for(int i = 0; i<16; i++)
    	{
    		a[i] = i+1;
    	}
    	return 0;
    }
    
    myclass::~myclass(void)
    {
    }
    

    Der Code so wie er ist ist stark vereinfacht. Das Array wird später > 12 Mio. felder groß sein, und es gibt keine möglichkeit vorher rauszufinden, wie groß es sein muss!

    Danke 🙂

    --------------------------------EDIT-----------------------------------

    Hatte mal gerade ne idee ... wäre das Politisch korrekt? Ich gebe ihm doch nur den zeiger zu der adresse zurück, kopiert wird doch nichts, oder?

    unsigned char* myarray;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	myclass* test = new myclass(myarray);
    
    	myarray = test->fill();
    	for(int i = 0; i<16 ; i++)
    	{	
    		printf("%i\t", myarray[i]);
    		if(myarray[i]%4 == 0 && i != 0)
    		{
    			printf("\n");
    		}
    	}
    	_getch();
    	return 0;
    }
    
    unsigned char* a;
    
    myclass::myclass(unsigned char* iarray)
    {
    	iarray = new unsigned char[16];
    	a = iarray;
    }
    
    unsigned char* myclass::fill()
    {
    	for(int i = 0; i<16; i++)
    	{
    		a[i] = i+1;
    	}
    	return a;
    }
    


  • > Das Array wird später > 12 Mio. felder groß sein

    Ganz sicher, dass du so eine bombastische Größe von über 12MB RAM während der Runtime wirklich brauchst? Für was ist das gut, wenn ich fragen darf. 🙂

    Edit:
    Naja, je nach dem, wie viele Ressourcen du hast, kannst du einen std::vector/list/was auch immer verwenden, je nach Iterator-Art. Aber bei so einer Datenmänge wird das sind ganz unerheblich. Bei meinem Win32 hat ein Char-Verktor 12 Bytes Größe, macht unterm Strich dann mindestens 144MB RAM. Array ist sparsam, aber recht unflexibel, vector ist sehr flexibel, aber kostet.
    Alternativ: du baust schnell eine eigene, kleine verkettete Liste, die zwar weniger Methoden als die STL hat, aber dafür schlanker ist.



  • - Was Du willst ist ein Vektor ( std::vector<> ).
    - Globale Variablen sind böse.
    - _tmain ist nicht standardkonform sondern Microsoft-spezifisch.



  • @ Ad aCTa

    Joup, muss, geht ums auslesen einer Farb-Zeilenkamera.

    @Sebastian
    - Welche vorteile hätte ein Vektor? Weil funktionieren tuts schon wies in meinem edit ist. [Edit] Ok, selbstnachschlagen macht schlau! 🙂
    - Ok, dann werde ich sie in die hölle schicken 😃
    - Aber ist doch immernoch C++, oder?

    [Edit] Die sache mit dem Vektor ist die, die API der kamera liefert ein char-array. [Edit]



  • blacksheep1 schrieb:

    Welche vorteile hätte ein Vektor?

    Mit Vektoren kann man dynamisch hantieren. Außerdem musst du keinen Extra-Speicher allokiieren, du rufst einfach std::vector::push_back( ); auf und kannst ein neues Element hinzufügen.

    blacksheep1 schrieb:

    Aber ist doch immernoch C++, oder?

    Da wir im C++-Forum sind: printf( ) und sein Datenerkennungsoperator "%" kommen aus der C-Standardbibliothek und haben in C++ nichts zu suchen. Benutze sattdessen std::cout.



  • check!



  • blacksheep1 schrieb:

    Wie würde ich "%" C++-konform ersetzen? 😃

    Wegen dem Smiley: War das jetzt ironisch gemeint? Zur Frage: Der zu dem Ausgabestream gehörige "<<"-Operator erwartet eine Zeichenkette oder eine Variable.



  • ne, ham grad aneinander vorbeigeredet ^^



  • blacksheep1 schrieb:

    ne, ham grad aneinander vorbeigeredet ^^

    Nein, warum?



  • ich sehe mehrere möglichkeiten:

    - mach den zeiger zur membervariable
    - schreib ne methode, die einen charzeiger liefert
    - last, not least, schreib deine funktion um:
    myclass::myclass(unsigned char** iarray, int n)
    {
    *iarray = new unsigned char[n];
    }



  • doch, ich dachte du meintest mit dem "%" das modulo, und nicht den "Datenerkennungsoperator" vom Printf.



  • blacksheep1 schrieb:

    doch, ich dachte du meintest mit dem "%" das modulo, und nicht den "Datenerkennungsoperator" vom Printf.

    Nein, dass hätte vom Kontext her doch überhaupt nicht gepasst.



  • Das rohe char-Array funktioniert normalerweise auch mit std::vector in dem du einen Speicherbereich bei der Instanziierung des Vektors angibst.
    Siehe dazu:
    http://cplusplus.com/reference/stl/vector/vector/ , speziell die Version

    template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
    


  • Ad aCTa schrieb:

    Alternativ: du baust schnell eine eigene, kleine verkettete Liste, die zwar weniger Methoden als die STL hat, aber dafür schlanker ist.

    Verkettete Listen sind nicht besonders speichersparend, da recht viele Zeiger nur für die Funktionalität des Containers benötigt werden. Gerade wenn es um char geht; da wird pro Element 1 Byte für die Daten und 8 Bytes für die zwei Zeiger verwendet. Eine effektive Nutzung von ungefähr einem Neuntel des angeforderten Speichers (evtl. sogar noch weniger durch Alignment) scheint mir nicht besonders platzsparend.

    Dafür sollte std::vector geeigneter sein. Eine eigene Klasse dafür zu basteln ist nicht unbedingt nötig, ein std::vector hat normalerweise ein paar wenige Bytes Overhead, die eigentlich nicht notwendig wären.

    blacksheep1 schrieb:

    [Edit] Die sache mit dem Vektor ist die, die API der kamera liefert ein char-array. [Edit]

    Das kannst du ja in einen Vector einfügen. Wie wurde der Speicher angefordert?

    Eventuell kannst du doch eine eigene kleine Containerklasse schreiben, damit du den Inhalt (die char s) nicht kopieren musst, sondern direkt in den Container verschieben kannst.


Anmelden zum Antworten