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.
-
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 warKonstrukte 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 alsQuickReference 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