wie kann ich eine matrix deklarieren, so dass sie von funktionen in versch. .c files benutzt werden kann ?



  • Ich hab folgendes Problem: Ich habe eine 2D matrix "float **matrix"
    global in einem c-file deklariert. Die matrix wird in einer Funktion
    dynamisch aufgebaut, also memory alloc und Zahlen reinschreiben.
    Ich möchte auf die Matrix auch von anderen C-files zugreifen, da ich sonst
    unübersichtlich viele Funktionen in einem .c-file hab.
    Ich hab versucht die Matrix bzw den Pointer in einem .h file zu deklarieren
    was aber erwartungsgemäss nicht funktioniert hat.
    auch den Pointer als parameter an funktionen zu übergeben klappt nicht.
    Hat irgendjemand eine Idee wie das zu machen ist ?

    Gruß,
    jannico



  • extern sollte eigentlich funktionieren:

    //matrix.h
    extern float** matrix;
    void init_matrix(int x,int y);
    
    //matrix.c
    float** matrix;
    void init_matrix(int x,int y)
    {
      //Speicher per malloc() anlegen und strukturieren
    }
    

    (wenn das nicht hilft, zeig mal etwas Code und vor allem die Fehlermeldungen des Compilers)



  • Man könnte den Matrixzeiger zwar via extern für andere bekanntmachen, aber ich würde es so lösen, dass die Funktion welche die Matrix aufbaut/initialisiert einen Zeiger auf diese zurückgibt, bzw. noch eine zusätzliche Funktion a la getPointer() die eben jenen Zeiger zurückliefert.



  • hm ich hab mal die extern-lösung probiert.
    ich hab vergessen zu schreiben dass ich auch noch 2 ints habe die die spalten
    anzahl und lininenanzahl angeben.

    also im .h file steht jetzt:
    extern float **matrix; // wird dynamicsh erzeugt.
    extern int rows = 0; // wird dynamisch gesetzt.
    extern int cols = 8;

    beim compilieren gibts folgenden error:
    [Warning 'rows' declared and initialized as extern.
    [Warning 'cols' declared and initialized as extern.
    multiple definitions of 'cols'.
    multiple definitions of 'rows'.
    [Linker error] undefined reference 'matrix'
    ....mehrmals

    noch irgendeine Idee woran das liegt.

    Danke,
    Jannico



  • Du musst zwischen Deklaration und Definition unterscheiden. Mit extern deklarierst du nur eine Variable. Du musst sie noch in _einem_ Modul definieren und dort kannst du sie auch initialisieren.



  • danke funktioniert.

    einen hab ich noch.
    ich hatte vorher die matrix mit static deklariert.
    jetzt ists deklariert als extern, damit gibts aber errors:
    ld error undefined reference zu matrix.
    wenn ichs als static deklariere funktioniert der matrix-zugriff aus dem
    anderen c file nicht.

    wie krieg ich das noch hin ? als extern static kann mans ja nicht deklarieren.

    Gruß und danke,
    jannico



  • lass das static einfach weg - das verträgt sich nicht mit extern
    (static besagt, daß das Objekt nur in der aktuellen Übersetzungseinheit (.C File) verfügbar ist)

    Die Lösung sieht damit so aus:

    //matrix.h
    //hier kommen nur extern-Deklarationen rein
    extern float** matrix;
    extern int rows;
    extern int cols;
    
    ...//Funktionen zur Verarbeitung dieser Matrix
    
    //matrix.c
    #include "matrix.h"
    //hier landen die zugehörigen Definitionen und evt. Initlialisierungen
    float** matrix;
    int rows = 5;
    int clos = 5;
    
    ...//Verarbeitungsfunktionen
    

    Übrigens bist du mit diesem Design etwas eingeschränkt - du hat im gesamten Programm EINE EINZIGE Matrix, mit der du arbeiten kannst. Besser ist es, den Pointer und die beiden Hilfsvariablen in ein struct zu packen und eine Funktion zur Verfügung zu stellen, die so eine struct zurückliefert:

    typedef struct
    {
      float** values;
      int rows;
      int cols;
    } matrix;
    
    matrix init_matrix(int r,int c)
    {
      matrix m = { malloc(r*sizeof(float*)),r,c };
      int i
      for(i=0;i<r;++i) m.values[i]=malloc(c*sizeof(float));
      return m;
    }
    


  • oh danke,

    das löst einige Probleme;

    merci,
    jannico


Anmelden zum Antworten