Dimensionen einer Matrix berrechnen.



  • Hallo Leute,

    ich hab eein Module geschrieben, um mir Matrixen mit variabler Spalten- und Zeilenzahl anzulegen.

    Die Matrix lege ich folgendermaßen an:

    #ifndef type
    	#define TYPE int 
    #endif
    #define matrix TYPE**
    
    matrix initmatrix(int lines, int columns){
    
    	int loop;
    	int loop2;
    
    	matrix m;
    
    	assert(lines > 0);
    	assert(columns > 0);
    
    	m	= malloc(lines * sizeof(TYPE *));
    	m[0]	= malloc(lines * columns * sizeof(TYPE));
    
    	for(loop = 1; loop < lines; ++loop){
    		m[loop] = m[loop - 1] + columns;
    	}
    
    	for(loop = 0; loop < lines; ++loop){
    		for(loop2 = 0; loop2 < columns; ++loop2){
    			m[loop][loop2] = 0;
    		}
    	}
    
    	return m;
    }
    

    Jetzt will ich auch ein 2 Funktionen zur Verfügung stellen die die Spalten- bzw. Zeilenanzahl einer Matrix zurückgeben. Dazu hab ich mir folgendes ausgedacht:

    int getlines(matrix m){
    	return (sizeof(m) / sizeof(matrix));
    }
    
    int getcolumns(matrix m){
    	return (sizeof(matrix[0]) / sizeof(matrix));
    }
    

    Leider leifern mir die beiden Funktionen nur 1 bzw. 0 zurück. Was bei genauem Nachdenken auch Sinn macht.

    Daher die Frage: Wie kann ich mir die Zeilen und Spaltenzahl einer MAtrix errechnen lassen??

    Danke schonmal.



  • Daher die Frage: Wie kann ich mir die Zeilen und Spaltenzahl einer MAtrix errechnen lassen??

    Speicher sie doch einfach...



  • mazal schrieb:

    Speicher sie doch einfach...

    Eben genau das will ich nicht. Das Modul ist so angelegt, dass ich mir mehrere Matrixen erzeugen kann. Wenn ich dazu noch immer die Zeilen und Spalten speichern muss, bringt das nur Chaos.



  • cpt.hawk schrieb:

    mazal schrieb:

    Speicher sie doch einfach...

    Eben genau das will ich nicht. Das Modul ist so angelegt, dass ich mir mehrere Matrixen erzeugen kann. Wenn ich dazu noch immer die Zeilen und Spalten speichern muss, bringt das nur Chaos.

    du hast doch schon eine 'struct matrx' irgendwo. mach einfach zwei members 'width und height' mit rein und gut ist's. das gibt kein chaos.
    🙂



  • Dann mach doch sowas: hier

    struct Matrix {
        int lines;
        int columns
        int **matrix;
    };
    
    void init_matrix(struct Matrix *m, int l, int c)
    {
        m->lines = l;
        m->colums = c;
    
        /* etc ... */
    }
    
    int main(void)
    {
        struct Matrix m;
    
        init_matrix(&m, 1024, 1042);
    
        printf("m.columns = %d, m.lines = %d\n", m.colums, m.lines);
    }
    

    Mit rumrechnerei auf lines und colums zu tun geht nicht wirklich.



  • Daran hab ich auch schon gedacht. Nur ist dabei das Problem, dass ich das Struct im Headerfile declarieren muss. Und das wollte ich eigentlich auch vermeiden, weil, dann der der Benutzer des Modules theoretisch an den Daten rumfummeln kann.



  • a) forward declaration wäre möglich
    b) bau dein Modul nicht für dumme Frickler, schreib in die Doku, dass man da nicht frickeln soll. Wer es doch macht hat halt versagt.



  • Tim schrieb:

    a) forward declaration wäre möglich

    Wie mach ich das???



  • Lies mal den ersten Treffer bei google...



  • Wunderbar. So klappt das wunderbar. thx4help


Log in to reply