Aufspannen von Feldern über Funktionen



  • Hallo,

    ich habe mir eine Funktion zur Bestimmung der Inversen einer Matrix erstellt. Diese liegt in einer library, um sie so aus dem Hauptprogramm aufrufen zu können.

    Die Invertierungs-Funktion arbeitet dabei mit einer Matrix, die wie folgt aufgebaut ist.

    Matrix: [dim][2*dim]
    1 0 0 a_11 a_12 a_13
    0 1 0 a_21 a_22 a_33
    0 0 1 a_31 a_32 a_33

    [dim] = 3

    Das Problem besteht darin, dass die Konstante, mit der ich die Dimension des Feldes aufspannen will, in der Funktion definiert werden muss - zumindest scheint es zurzeit so.
    Hier einmal der Ansatz des Code, welchen ich verwende:

    // linalg.h
    const int dim = 3;
    
    void MATRIX_INV(double A[dim][dim], double A_inv[dim][dim]) {
     double Matrix[dim][2*dim]; // Hier entsteht der Fehler. Der Compiler erforder die Verwendung einer Konstanten...
     .....
    }
    
    // HP
    void main(void) {
     double A[dim][dim], A_inv[dim][dim];
     ...
     MATRIX_INV(A, A_inv);
     ...
    }
    

    Wäre nett, wenn mir jemand helfen könnte.

    Gruß,

    W2K2005



  • Mit const deklarierten Variablen erzeugst du in C keine echte Compilezeit-Konstante (die z.B. als Arraydimension verwertbar ist), das ist nur in C++ möglich. In C bleibt dir also nichts anderes übrig, als ein Präprozessor-#define für dim (besser dann DIM) zu benutzen.



  • oder malloc mit einem int**

    hth
    ciao



  • Hallo,

    wie muss ich eine derartige #define-Anweisung am besten Umsetzen?
    Habe schon einmal etwas ähnliches probiert - das hat allerdings nicht wirklich funktioniert....

    Ist diese Definition dann auch global für alle Abschnitte meines Programmes?

    Gruß + besten Dank,

    W2K2005

    // linalg.cpp
    
    #define DIM = 3;
    
    void matrix_inv(double A[DIM][DIM], A_inv[DIM][DIM]) {
     double matrix[dim][2*DIM]; // Ich bezweifle ein wenig, dass dies funktioniert, weil ich meine
                                // selbst etwas ähnliches definiert zu haben.
                                // Bei mir war DIM allerdings noch klein geschrieben...
    }
    


  • muss heissen

    #define DIM 3
    

    Kurt



  • W2K2005 schrieb:

    Habe schon einmal etwas ähnliches probiert - das hat allerdings nicht wirklich funktioniert....

    Ähnlich reicht auch nicht 😉

    Ist diese Definition dann auch global für alle Abschnitte meines Programmes?

    Nein, sie muss schon sichtbar sein. Befass dich mal allgemein mit der Funktion des Präprozessors, dann wird das klarer.



  • Damit die Funktion mit unterschiedlich großen Feldern arbeiten kann ist es glaube ich notwendig mit dem Ansatz

    oder malloc mit einem int**

    allerdings mit double ** zu arbeiten, allerdings brauchat du dann eine Übergabeparameter mit der gewünschten dimension

    #define PASS 0
    #define FAIL 1
    int  matrix_inv(double **A, double **A_inv, int dim)
    {
     int err=PASS;
     int i;
     double **matrix;
     if (0==(matrix=calloc(dim,sizeof(double))))
        {
         printf("error in calloc von matrix not enough memory")
         return FAIL;
        }
    for (i=0;i<dim;i++)
     if (0==(matrix[i]=calloc(2*dim,sizeof(double))))
        {
         //... hier die nötigen frees nicht vergessen
         printf("error in calloc von matrix not enough memory")
         return FAIL;
        }
    //......
    for (i=0;i<dim;i++)
     free(matrix[i]);
    free(matrix);
    return PASS;
    }
    


  • Hallo,

    kannst Du mir bitte noch einmal den Sytnax der nachfolgenden Zeile erklären. Ich kenne diese Schreibweise (2 Gleichheitszeichen hintereinander) nicht.

    Und warum machst diese Größenabfrage gleich zweimal hintereinander?

    if (0==(matrix=calloc(dim,sizeof(double))))
        {
         printf("error in calloc von matrix not enough memory")
         return FAIL;
        }
    for (i=0;i<dim;i++)
     if (0==(matrix[i]=calloc(2*dim,sizeof(double))))
        {
        } 
    }
    

    Die Matrixelemente werden in Deinem Code über matrix[i][j] verändert? Richtig? Wie weißt Du dieser Matrix die Adresse der Pointer zu? Warum setzt Du übrigends 2 Sterne vor die Pointer? Muss man das bei 2D-Feldern tun?

    Gruß und danke für die Geduld,

    W2K2005



  • W2K2005 schrieb:

    Hallo,

    kannst Du mir bitte noch einmal den Sytnax der nachfolgenden Zeile erklären. Ich kenne diese Schreibweise (2 Gleichheitszeichen hintereinander) nicht.

    == ist der Gleichheitsoperator, a==b ergibt wahr (d.h. den Wert 1) wenn a und b gleich sind, ansonsten falsch (d.h. den Wert 0). != ist der Ungleichoperator. Aber ich glaube, du solltest dir jetzt wirklich ein Buch vornehmen.



  • @W2K2005

    Konstrukte wie diese befinden sich auf der ersten Seite des Einführungskapitels von if

    if (0==(#
    

    Welche Größenabfrage meinst du.
    Ich überüprüfe in den beiden if´s ob die Allokierung von Memory erfolgreich war

    Konstrukte wie diese befinden sich auf der ersten Seite des Einführungskapitels von Allokierung

    if (0==(matrix=calloc(
    

    Benutzung von Pointern Bedeutung von Klammern Austauschbarkeiten von Schreibweisen
    Konstrukte wie diese befinden sich auf der Seite 2 oder 3 des Einführungskapitels von Pointern unf Feldern

    - int *peter
    - hier allokierung
    - *(peter+5)≡peter[5]

    Bei dem Lösungsvorschlag ging ich davon aus des das C-Grundwissen d.h.
    mindestens besser als

    QuickReference C für Dummies €5.00

    vorhanden ist.
    Auch wenn es ein eigenartiger Name für ein Buch ist, es definiert zumindest eine n Wissenslevel


Anmelden zum Antworten