C: Matrix beliebiger Länge übergeben

Hey,

folgendes Setting:

Code:
#include <stdio.h>
#include <string.h>

typedef unsigned int uint32_t;
typedef uint32_t row[11];
const row A = {0}; //egal was hier drin steckt..

// operation on row-type
void do_was_anderes( row B ){
    // Keine Operation
    // soll nur Variablen erhalten
    // ggf. ist ein Output als Test erforderlich.
}

// operation on array of row-types
void do_( uint32_t *B, uint32_t n ){
    int i;
    for(i=0; i<n; i++){
        do_was_anderes( &B[i] ); //B[i] ist vom Typ row
    }
}

// initializing do_ operation
int do_main(  uint32_t n ){
    typedef row matrix[n];
    matrix B;
    
    uint32_t size = n*11*sizeof(uint32_t);  
	memset( B, 0, size);
    
    do_( B ,n);

    return 1;
}

int main(){
    return do_main(2);
}

Error bekomme ich z.B. an der Stelle, wo B reingeworfen wird, wegen Typenfehler. Es geht viel mehr darum, die Argumente sauber zu übergeben. In B speichere ich eine Matrix aus n Zeilen, die dem Datentypen von A entsprechen. Dieser ist selbst ein Array. Insgesamt sollen diese Teile dann an eine letzte Funktion übergeben werden, die für diese Arrays geschaffen ist. Die Länge von B (da variabel) übergebe ich in "n".

Insgesamt ein einfaches Programm, dass erstmal nichts macht, sondern nur das Taling nachvollziehen lässt.

Fehler z.B.

Code:
typedef row matrix[n];
>>> error: variable-sized object may not be initialized

row C0 = {0};
>>> warning: excess elements in array initializer
>>> note: (near initialization for 'C0')
>>> error: variable-sized object may not be initialized

die letzte Warnung lässt sich verstehen, da kein Speicher reserviert werden kann, kann die Variable auch nicht initialisiert werden.. muss man also über memset selber machen.
 
Zuletzt bearbeitet:
Arrays and Pointers 2.10
und Rheinwerk Computing :: C von A bis Z – 11.9 Mehrdimensionale Arrays
sind nice to know. Ich dachte bis heute, dass Mehrdimensionale Arrays einfach Pointer auf Pointer sind..

Lösung:
Code:
#include <stdio.h>
#include <string.h>

typedef unsigned int uint32_t;
typedef uint32_t row[11];
const row A = {0}; //egal was hier drin steckt..

// operation on row-type
void do_was_anderes( row A ){
    // Keine Operation
    // soll nur Variablen erhalten
    // ggf. ist ein Output als Test erforderlich.
    for(int i=0; i<11; i++){
        printf("%08X\n", A[i]);
    }
}

// operation on array of row-types
void do_( uint32_t B[][11], uint32_t n ){
    int i;
    for(i=0; i<n; i++){
        do_was_anderes( B[i] ); //B[i] ist vom Typ row
    }
}

// initializing do_ operation
int do_main(  uint32_t n ){
    typedef row matrix[n];
    matrix B;
    
    uint32_t size = n*11*sizeof(uint32_t);  
	memset( B, 0, size);
    
    do_( B ,n);

    return 1;
}

int main(){
    return do_main(2);
}
 
Zuletzt bearbeitet:
Zurück
Oben