Matrix in Array speichern
-
asdf
-
Zum Beispiel so:
#include <stdio.h> int main(void) { double A[2][3] = {{1,2,3},{4,5,6}}; double *zeiger = A; int i; for (i = 0; i < 6; i++) printf("zeiger[%i] -> %f\n", i, zeiger[i]); }
Wenn ich dich richtig verstanden habe. Hier geht es um die Art und Weise, wie Arrays im Speicher angeordnet werden.
Edit:
Den math.h-Include hab ich rausgenommen, der war unabsichtlich hineingerutscht.
-
fredneumi schrieb:
ich bräuchte es so: A = {1,2,3,4,5,6};
So ist es schon im Speicher, man muss nur noch dem Compiler sagen, dass man es wie ein 1-d-Array verwenden will.
-
ok. danke. ich probiers mal
-
asdf
-
fredneumi schrieb:
wie kann ich aber den maximal wert bestimmen. die matrix kann ja verschieden groß sein?
Du musst wissen, wie welche Dimensionen die Matrix hat, sonst kannst du sie ja nicht anlegen. Zur Laufzeit eines C-Programmes gibt es keine Arrays mehr, weil die Elemente (wie oben gezeigt) nacheinander im Speicher abgelegt werden. Eine Information über die Dimension ist dann nicht mehr vorhanden.
Dagegen werden zwei Techniken benutzt: 1.) man merkt sich die Dimension in irgendeiner Variable, oder 2.) man definiert einen Wert für das "Ende" der sinnvollen Daten, wie z.B. das Nullzeichen bei Zeichen-Arrays.
-
oder 3.) Man verwendet sizeof
sizeof(A)/sizeof(**A)); sizeof(A)/sizeof(A[0][0])); sizeof(A)/sizeof(double));
-
ergänzung schrieb:
oder 3.) Man verwendet sizeof
Hatte ich ganz vergessen. Dabei muss man als Anfänger aufpassen, dass man wirklich ein Array hat, und keinen Zeiger. Mich hat anfangs fein verwirrt, dass man Arrays nicht als Argumente übergeben kann.
-
fredneumi schrieb:
hallo.
ich muss aus einer Matrix : double A[2][3] = {{1,2,3},{4,5,6}};
die Zahlen hintereinander in ein array speichern.Je nachdem welches Ordering (C verwendet row-major odering) erforderlich ist, reicht es einfach aus den Zeiger auf das erste Elemente zu übergeben.
Zum Thema Ordering bitte folgenden Artikel durchlesen
http://en.wikipedia.org/wiki/Row-major_orderDa cBLAS column-major ordering nutzt, muß man auch zuweilen in C, das column-major ordering nutzen.
-
~john schrieb:
Da cBLAS...
Bitte was?
-
mngbd schrieb:
Bitte was?
cBLAS ist ein Beispiel dafür, weshalb man manchmal column-major ordering in C braucht.
-
~john schrieb:
cBLAS ist ein Beispiel dafür, weshalb man manchmal column-major ordering in C braucht.
Danke!
-
asdf
-
fredneumi schrieb:
super. geht gut. nun müsste ich aber noch die Anzahl der Spalten auslesen. Geht das irgendwie?
Du mußt die notwendigen Informationen immer getrennt speichern, da sie C nicht vorhält.
-
sadf
-
fredneumi schrieb:
kann man die spaltenanzahl überhaupt speichern?
Mit
sizeof
? Das geht z.B. so:#include <stdio.h> #define ZEILEN (2) #define SPALTEN (3) int main(void) { double A[ZEILEN][SPALTEN] = {{1,2,3},{4,5,6}}; printf("zeilen: %d\n", sizeof(A) / sizeof(A[0])); printf("spalten: %d\n", sizeof(A[0]) / sizeof(A[0][0])); }
Das darf dich aber nicht darüber hinwegtäuschen, dass diese Zahlen schon zur Compilezeit feststehen. In diesem Sinn ist der sizeof-Operator nur eine Schreibhilfe.
Nachtrag: in C99 müssen diese Dimensionen nicht unbedingt zur Compilezeit bekannt sein, weil es Arrays mit variabler Länge gibt.
-
asdf
-
fredneumi schrieb:
Wenn ich das mache hier: *azeiger[0] + *bzeiger[k];
mäckert der compiler... hat jmd ne ahnung wieso?Keine Ahnung, ist das ein C++-Compiler? Anyway, versuch mal statt Zeile 6:
double *zeiger = &A[0][0];
-
sadf
-
fredneumi schrieb:
gcc compiler.
mit dem gehts auch nichtIch blick gerade nicht völlig durch, bitte zeig ein kurzes lauffähiges Beispiel, in dem das Problem besteht.