3 dimensionalen Vektor in eine Funktion kopieren
-
Hallo Leute ich bekomm es nicht hin einen 3 dimensionalen Vektor in eine Funktion zu kopieren. Es ist leider nicht so möglich als würde man einen 1d Vektor kopieren...
#include <stdio.h> int main() { int blatt[7][2][2]; blatt[0][0][0]=1; blatt[1][0][0]=2; blatt[0][0][0]=3; blatt[3][1][0]=4; blatt[0][1][1]=5; blatt[0][0][1]=6; blatt[1][1][0]=7; funktion(blatt); return 0; } int funktion(int *pw) // Karten nach Werten sortieren { int blatt[7][2][2]; int i; for(i=0;i<=7;i++) { blatt[i][0][0]=*pw; pw++; } return 0; }
Die Zuweisungen
blatt[0][0][0]=1; blatt[1][0][0]=2; blatt[0][0][0]=3; blatt[3][1][0]=4; blatt[0][1][1]=5; blatt[0][0][1]=6; blatt[1][1][0]=7;
sind nur zum überprüfen der Testfunktion
Schonmal danke für Hilfe!
-
Nein, entschuldigung, ich brauch nur einen 2 dimensionalen Vektor. So müsste es klappen...
#include <stdio.h> int main() { int blatt[7][2]; blatt[0][0]=1; blatt[1][0]=2; blatt[0][0]=3; blatt[3][1]=4; blatt[0][1]=5; blatt[0][0]=6; blatt[1][1]=7; funktion(blatt); return 0; } int funktion(int *pw) { int i; int blatt[7][2]; for(i=0;i<=7;i++) { blatt[i][0]=*pw } return 0; }
... tut es natürlich nicht.
EDIT: Ihr braucht mir natürlich nicht genau schreiben wie man dann die einzelnen Werte mit dem Zeiger kopiert sondern ich muss nur die Form wissen, dass das Programm keinen Fehler hat und nicht abstürzt.
Heißt, es soll einfach nur ein Zeiger in der funktion auf den wert blatt[0][0] der mainfunktion zeigen. Vielen Dank
-
dahaack schrieb:
Heißt, es soll einfach nur ein Zeiger in der funktion auf den wert blatt[0][0] der mainfunktion zeigen. Vielen Dank
?? Wenn du einen Zeiger auf das 1. Element brauchst, dann würde das so aussehen:
void funktion(int *p); und die Übergabe: funktion(&blatt[0][0]);Kann mir nicht vorstellen, dass du das wolltest.
Das gesamte Array kannst du so übergeben:
void funktion(int **p); und die Übergabe: funktion( (int**) blatt );
-
und abgesehen davon läuft deine schleife zu lange, länge 7 in einem array heißt, dass es die elemente 0 bis 6 gibt, also müsste die schleife heißen:
for(i = 0; i < 7; ++i) //...
-
Hi!
Danke für eure Antworten!
Kannst du das was du da geschrieben hast auch in Worte fassen?
Ich hab hier dieses Programm:
#include <stdio.h> int main() { int blatt[7][2]; blatt[0][0]=1; blatt[1][0]=2; blatt[0][0]=3; blatt[3][1]=4; blatt[0][1]=5; blatt[0][0]=6; blatt[1][1]=7; funktion((int**) blatt); return 0; } int funktion(int **pw) { int i; int blatt[7][2]; for(i=0;i<=6;i++) { blatt[i][0]=*pw; } return 0; }
Erst einmal der Funktionsaufruf
funktion((int**) blatt);
Wo ist der Unterschied zwischen
int **blatt;
und
(int**) blatt);
?
int **blatt wäre soviel wie ein Zeiger auf einen Zeiger, richtig?
Die Funktion selbst
int funktion(int **pw)
Es wurde also der Funktion ein Zeiger übergeben der auf einen Zeiger zeigt, und dieser Zeiger zeigt auf den ersten Wert von blatt[7][2] der nichts anderes ist als blatt[0][0].
So, alles falsch oder ist auch was richtig?
-
this->that schrieb:
Das gesamte Array kannst du so übergeben:
void funktion(int **p); und die Übergabe: funktion( (int**) blatt );Nene, so sicher nicht.
void func ( int p[][CONSTANT] ); // oder void func ( int (*p)[CONSTANT] );
-
Doch, es funktioniert schon wie thisthat es geschrieben hat. Hier das Programm...
#include <stdio.h> int main() { int karte[9][2]; int blatt[7][2][2]; karte[0][0]=0; karte[1][0]=10; karte[2][0]=20; karte[3][0]=30; karte[4][0]=40; karte[5][0]=50; karte[6][0]=60; karte[7][0]=70; karte[8][0]=80; karte[0][1]=1; karte[1][1]=11; karte[2][1]=21; karte[3][1]=31; karte[4][1]=41; karte[5][1]=51; karte[6][1]=61; karte[7][1]=71; karte[8][1]=81; funktion((int**) karte, (int**) blatt); return 0; } int funktion(int **pk, int **pb) { int i; int blatt[7][2][2]; for(i=0;i<=6;i++) { blatt[i][0][0]=*pk; // Werte der eigenen Karten laden pk++; blatt[i][1][0]=*pk; // Farben der eigenen Karten laden pk++; } pk=pk-10; for(i=0;i<=6;i++) { blatt[i][0][1]=*pk; // Werte der gegnerischen Karten laden pk++; blatt[i][1][1]=*pk; // Farben der gegnerischen Karten laden pk++; } for(i=0;i<=7;i++) { *pb=blatt[i][0][0]; pb++; *pb=blatt[i][0][1]; pb++; *pb=blatt[i][1][0]; pb++; *pb=blatt[i][1][1]; pb++; } return 0; }
alerdings weiß ich nicht was das (int**) und **pk bedeutet. Also ich mein: Wo ist der Unterschied?
-
dahaack schrieb:
Doch, es funktioniert schon wie thisthat es geschrieben hat.
Es funktioniert nicht, du erkennst wohl lediglich nicht, dass es nicht funktioniert. Vergleich hier mal den Unterschied:
#include <stdio.h> #define DIM 4 void foo ( int (*a)[DIM] ) { int i,j; puts ( "foo()" ); for ( i=0; i<DIM; i++ ) { for ( j=0; j<DIM; j++ ) { printf("%d\n", a[i][j] ); } } } void bar ( int **a ) { int i,j; puts ( "bar()" ); for ( i=0; i<DIM; i++ ) { for ( j=0; j<DIM; j++ ) { printf("%d\n", a[i][j] ); } } } int main (void) { int arr[DIM][DIM] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9,10,11 }, {12,13,14,15 } }; foo ( arr ); bar ( (int **)arr ); return 0; }
-
Tim schrieb:
void bar ( int **a ) { int i,j; puts ( "bar()" ); for ( i=0; i<DIM; i++ ) { for ( j=0; j<DIM; j++ ) { printf("%d\n", a[i][j] ); } } }
void bar ( void *a ) { // <--- void* int i,j; puts ( "bar()" ); for ( i=0; i<DIM; i++ ) { for ( j=0; j<DIM; j++ ) { printf("%d\n", ((int*)a+i*DIM)[j] ); // <--- ;) } } }
-
@ euch beide:
bei "oder so..." versteh ich ein bisschen Bahnhof und bei Tim versteh ich nurnoch Bahnhof. Ich hab das Programm eben nochmal getestet und doch, es funktioniert doch. Er spuckt zwar ein paar Warnungen aus aber es funnktioniert.
c:\hallo\main.c(45) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'int ' und 'int *' unterschiedlich
c:\hallo\main.c(50) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'int *' und 'int ' unterschiedlich
-
dahaack schrieb:
c:\hallo\main.c(45) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'int ' und 'int *' unterschiedlich
c:\hallo\main.c(50) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'int *' und 'int ' unterschiedlichbei sowas kannst du getrost davon ausgehen, dass der code grütze ist (crashed früher oder später)