dynamisches zweidimensionales Array in Klasse



  • Mojens !!!

    Ich benötige ein zweidimensionales Array, dessen zweite Dimension erst beim Aufruf einer Klasse bekannt wird.

    Eindimensional ist es ja recht einfach:

    x=20;
    float *array ; // steht privat im Header
    array = new float[x]; // steht im Konstruktor
    

    Wie gehts zweidimensional ???
    Ich habs so versucht:

    float* array[34]; // im Header
    x=20;
    array[34] = new float[x]; // in Konstruktor
    

    bekomme nach erfolgreicher Kompilierung beim Start nen Segmentaion Fault.

    Klar könnte ich das Array auch in einer Zeile komlett neu Anlegen (da weiß ich wie's geht). Da float *array[34] aber im Haeder einer klasse als privat deklariert werden soll und die zweite Dimension erst beim "Aufruf" der Klasse bekannt wird muss ichs in zwei Schritten machen.

    Danke schon mal und einen schönen Tag !!!!



  • hier mal ein allgemeines Bsp, analog auch bei dir

    //in der headerdatei
    #ifndef MATRIX_H
    #define MATRIX_H
    
    class MATRIX{
    	private:
    		unsigned int numOfRows;
    		unsigned int numOfColumns;
    		int ** element;
    	public:															
    		MATRIX(unsigned int, unsigned int);
    		MATRIX(const MATRIX &);
    		~MATRIX(void);	
    .................................blabla
    //in der .cpp
    MATRIX::MATRIX(unsigned int rows=1, unsigned int columns=1)				//Konstruktor
    : numOfRows(rows), numOfColumns(columns), element(NULL){							//Elementinitialisierer
    
    	element = new int * [numOfRows];														//dyn Allokation nXm 
    	for(int row=0; row<numOfRows ;row++){
    		element[row] = new int [numOfColumns]; 
    	}
    }
    //----------------------------------------------------------------------------------
    MATRIX::MATRIX(const MATRIX & source){								//CopyKonstruktor
    
    	numOfRows = source.numOfRows;
    	numOfColumns = source.numOfColumns;
    
    	element = new int * [numOfRows];														
    	for(int row=0; row<numOfRows ;row++){
    		element[row] = new int [numOfColumns]; 
    		for(int column=0; column<numOfColumns ;column++){
    			element[row][column] = source.element[row][column];
    		}
    	}
    }
    //----------------------------------------------------------------------------------
    MATRIX::~MATRIX(void){											//Destruktor
    
    	for(int row=0; row<numOfRows ;row++){								//Freigabe 
    		delete []element[row]; 
    	}
    	delete []element;
    }
    ....................................blabla
    

    @all: natürlich ist auch dieser code kein Optimum....



  • Prima Beispiel.
    Danke !!!



  • Zu früh gefreut!

    Ich machs genau so.

    Header:

    class read_data
    {
    private:
    
    float **fData;
    .
    .
    .
    

    Klasse:

    read_data::read_data(int arg_c,char *arg_v[])
    {
    
    iRows = 34;
    arg_c = arg_c-1;
    
    fData = new *float[arg_c];
    
    for (int i=0;i<arg_c;i++)
    fData[i] = new float[iRows];
    

    Bekomme einen syntax error before `*' token in der Zeile:

    fData = new *float[arg_c];
    

    Mein Ursprüngliches Problem eine Dimension schon im Header zu bilden und die zweite dann bei Klassenaufruf funktioniert. Aber so wie es in dem Beispiel gemacht wird müsste es doch auch funktionieren. Da ich diese Lösung noch etwas eleganter finde möchte ich sie auch benutzen und verstehe nicht, warum es zu dieser Fehlermeldung kommt. Davor ist definitiv kein syntax-Error, denn mit meiner alten Version funktioniert es ja und vor dieser Fehlerhaften Zeile ändert sich nichts.

    😞



  • fData = new float*[arg_c];
    


  • FAQ



  • @Windalf

    Danke !!!
    jetzt läufts. 🙂

    Diese Sternchen und ihre Anordnung machen mich noch völlig verrückt.

    schöne Grüße und Danke an alle fleißigen Helfer,

    -revolutz


Anmelden zum Antworten