"Pointer-Inhalt" in ein Array speichern
-
Hallo,
ich hätte eine Frage und wäre sehr froh, wenn mir jemand einen Tipp geben könnte!
also angenommen ich habe ein Feld von Pointer (double *ptr[10]), wobei die Pointer jeweils auf eine Zeile von einer [10]x[8]-Matrix zeigen. Dann arbeite ich mit den Pointern weiter (ändere Zahlen, sortier die Reihenfolge der Pointer um...). Zum Schluss möchte ich die Werte, auf die die Pointer zeigen wieder in ein Array (double array[10][8]) einfügen. Ich hätt das so versucht:for(i=0; i<10; i++) { for(j=0; j<8; j++) array[i][j] = *(ptr[i]+j); }
Aber es werden komischerweise nicht immer die richtigen Werte eingetragen...!
Gibts vielleicht dafür eine andere Lösung? Oder eine spezielle Funktion?
-
michi12 schrieb:
Aber es werden komischerweise nicht immer die richtigen Werte eingetragen...!
Das sieht eigentlich richtig aus. Wie stellst du fest, dass die Werte falsch sind? Vermutlich ist an anderer Stelle im Programm etwas falsch.
Gibts vielleicht dafür eine andere Lösung? Oder eine spezielle Funktion?
memcpy.
-
SeppJ schrieb:
Wie stellst du fest, dass die Werte falsch sind?
Ich lass mir zuerst die Werte über den Pointer ausgeben (so mit printf("%g ", *(ptr[i]+j));...). Dann füg ich die Zahlen in das Array ein und lass sie mir als Array ausgeben. Der Fehler sieht dann so aus, dass z.B. der Pointer-Output ist:
1,1,1,1,1
2,2,2,2,2
3,3,3,3,3
4,4,4,4,4
5,5,5,5,5aber bei dem Array erhalte ich:
1,1,1,1,1
2,2,2,2,2
1,1,1,1,1
4,4,4,4,4
5,5,5,5,5also eine Zeile überschreibt einfach eine andere...
Habs jetzt auch mit memcpy versucht:
for(i=0; i<5; i++) memcpy(&array[i], ptr[i], sizeof(double)*5);
aber da habe ich das selbe Problem...
Aber wie kann das denn sein, wenn es über den Pointer richtig ausgegeben wird? Ja, vermutlich ist im übrigen Code irgendwo ein Fehler...
(Das Programm ist aber leider etwas zu groß, um es hier zu posten...)
-
michi12 schrieb:
Aber wie kann das denn sein, wenn es über den Pointer richtig ausgegeben wird? Ja, vermutlich ist im übrigen Code irgendwo ein Fehler...
(Das Programm ist aber leider etwas zu groß, um es hier zu posten...)Dann kürz es! Siehe den dritten Link in meiner Signatur.
-
Danke für den Tipp mit dem Kürzen! – hab den Fehler nämlich nicht beim Quicksort-algorithmus vermutet gehabt...Hab ihn hier etwas abgekürzt gepostet.
Und ich denke, dass der Fehler bei Zeile 18 bzw. 27 ist, weiß aber nicht genau, wie ich den beheben kann...
Hab c-fee 4.0 (mingw2.95 compiler) verwendet.#include <stdio.h> void quickSort(double *array[], int left, int right, int x) { double value; double *h; value = *(array[left]+x); h = array[left]; while (left < right) { while ((*(array[right]+x) >= value) && (left < right)) right--; if (left != right) { array[left] = array[right]; left++; } while ((*(array[left]+x) <= value) && (left < right)) left++; if (left != right) { array[right] = array[left]; right--; } } //end while array[left] = h; } //end quickSort main() { int i, j; double *ptr[6]; double feld[6][2]= { {15, 5}, {16, 6}, {13, 3}, {12, 2}, {14, 4}, {11, 1} }; for(i=0; i<6; i++) ptr[i] = &feld[i][0]; //ptr nach 2. Spalte sortieren quickSort(ptr, 0, 5, 1); //Output von ptr for(i=0; i<6; i++) { for(j=0; j<2; j++) printf("%g ", *(ptr[i]+j)); printf("\n"); } printf("\n"); //ptr-Inhalt wieder in feld speichern for(i=0; i<6; i++) memcpy(&feld[i], ptr[i], sizeof(double)*2); //Output von feld for(i=0; i<6; i++) { for(j=0; j<2; j++) printf("%g ", feld[i][j]); printf("\n"); } } //end main