Zweidemensionalen Zeiger an Funktion übergeben
-
Ich habe im Internet gesucht und etwas dazu gefunden bin soweit gekommen.
void uebergabe((*zeiger_feld)[10]){ //--- } int main(){ char feld[10][10]={{'_','_','_','_','_','_','_','_','_','_'},//0 {'_','_','_','_','_','_','_','_','_','_'},//1 {'_','_','_','_','_','_','_','_','_','_'},//2 {'_','_','_','_','_','_','_','_','_','_'},//3 {'_','_','_','_','_','_','_','_','_','_'},//4 {'_','_','_','_','_','_','_','_','_','_'},//5 {'_','_','_','_','_','_','_','_','_','_'},//6 {'_','_','_','_','_','_','_','_','_','_'},//7 {'_','_','_','_','_','_','_','_','_','_'},//8 {'_','_','_','_','_','_','_','_','_','_'}};//9 // 0 1 2 3 4 5 6 7 8 9 char (*zeiger_feld)[10]=feld; uebergabe((*zeiger_feld)[10]); return 0; }Es klappt auch nicht. Also Frage: Wie kann ich eine zweidimesionalen Array Zeiger einer FUnktion übergeben?
-
template<std::size_t N, std::size_t U> void uebergabe(int (&arr)[N][U]) { // put your magic here } int main() { char feld[10][10] = /* ... */; uebergabe(feld); }Alternative: std::array.
-
patrick246 schrieb:
Alternative: std::array.
Ich würde genrne (immer noch) ein X mit den Pfeiltasten bewegen.
Ich habe links und rechts fertig.
Dabei habe ich ein Zeiger genommen und das vorherige X durch ein _ zu erstetzen. Und nun möchts ich das X auch nach oben und unten bewegen können dafür brauche ich einen Zeiger. Allerdings darf der Zeiger ja nicht jedesmal neu in der Funktion angelegt werden.#include <iostream> #include <conio.h> using namespace std; namespace taste{ const int p_oben = 72; const int p_unten = 80; const int p_rechts = 77; const int p_links = 75; const int esc = 27; } void pos_ausabe(char feld[], int bewegung, int &position, char (*zeiger_feld)[10]){ //passiert was } int main(){ int eingabe=0, position=0; int bewegung=0; char feld[10][10]= {{'_','_','_','_','_','_','_','_','_','_'},//0 {'_','_','_','_','_','_','_','_','_','_'},//1 {'_','_','_','_','_','_','_','_','_','_'},//2 {'_','_','_','_','_','_','_','_','_','_'},//3 {'_','_','_','_','_','_','_','_','_','_'},//4 {'_','_','_','_','_','_','_','_','_','_'},//5 {'_','_','_','_','_','_','_','_','_','_'},//6 {'_','_','_','_','_','_','_','_','_','_'},//7 {'_','_','_','_','_','_','_','_','_','_'},//8 {'_','_','_','_','_','_','_','_','_','_'}};//9 // 0 1 2 3 4 5 6 7 8 9 char (*zeiger_feld)[10]=feld; pos_ausabe(feld, bewegung, position, (*zeiger_feld)[10]); do{ eingabe=getch(); switch(eingabe){ case taste::p_oben: cout << "oben\n"; break; case taste::p_unten: cout << "unten\n"; break; case taste::p_rechts: bewegung=1; pos_ausabe(feld, bewegung, position, (*zeiger_feld)[10]); break; case taste::p_links: bewegung=-1; pos_ausabe(feld, bewegung, position, (*zeiger_feld)[10]); } }while(eingabe!=taste::esc); return 0; }Ich hätte die Frage gleich so Stellen sollen... . Weil ich bin noch zu "schlecht" um dein zu verstehen.

-
Wenn du statt des Zeigers x/y-Koordinaten nimmst fällt es dir bestimmt viel leichter.
Wenn du einen Zeiger nimmst, der auf dein Element zeigt, dann ist das ein *char **. Dein zeiger_feld kann gar nicht auf ein Element zeigen, denn es zeigt auf eine ganze Zeile. Wenn du ein *char element hast kannst du mit element += 10 nach unten und mit element -= 10 nach oben. Pass aber auf, dass du nicht aus dem Array raus läufst!
-
nwp3 schrieb:
Wenn du statt des Zeigers x/y-Koordinaten nimmst fällt es dir bestimmt viel leichter.
Wie meinst du das ?

-
int x = 5, y = 5; //wir starten an position 5/5 feld[x][y] = '_'; //altes 'X' weg switch(eingabe){ //position anpassen case taste::p_oben: if (y) y--; break; case taste::p_unten: if (y < 9) y++; break; case taste::p_rechts: if (x < 9) x++; break; case taste::p_links: if (x) x--; break; } feld[x][y] = 'X'; //neues 'X' hin
-
nwp3 schrieb:
int x = 5, y = 5; //wir starten an position 5/5 feld[x][y] = '_'; //altes 'X' weg switch(eingabe){ //position anpassen case taste::p_oben: if (y) y--; break; case taste::p_unten: if (y < 9) y++; break; case taste::p_rechts: if (x < 9) x++; break; case taste::p_links: if (x) x--; break; } feld[x][y] = 'X'; //neues 'X' hinnwp3 schrieb:
int x = 5, y = 5; //wir starten an position 5/5 feld[x][y] = '_'; //altes 'X' weg switch(eingabe){ //position anpassen case taste::p_oben: if (y) y--; break; case taste::p_unten: if (y < 9) y++; break; case taste::p_rechts: if (x < 9) x++; break; case taste::p_links: if (x) x--; break; } feld[x][y] = 'X'; //neues 'X' hinDanke!
Hier mein Code
#include <iostream> #include <conio.h> using namespace std; namespace taste{ const int p_oben = 72; const int p_unten = 80; const int p_rechts = 77; const int p_links = 75; const int esc = 27; } void pos_ausabe(int &zahler, int &y, int &x){ //Mehrfach deklariert ?? char feld[10][10]= {{'_','_','_','_','_','_','_','_','_','_'},//0 {'_','_','_','_','_','_','_','_','_','_'},//1 {'_','_','_','_','_','_','_','_','_','_'},//2 {'_','_','_','_','_','_','_','_','_','_'},//3 {'_','_','_','_','_','_','_','_','_','_'},//4 {'_','_','_','_','_','_','_','_','_','_'},//5 {'_','_','_','_','_','_','_','_','_','_'},//6 {'_','_','_','_','_','_','_','_','_','_'},//7 {'_','_','_','_','_','_','_','_','_','_'},//8 {'_','_','_','_','_','_','_','_','_','_'}};//9 // 0 1 2 3 4 5 6 7 8 9 if(x<0){ x=0; } else if(x>9){ x=9; } else if(x<9 && x>0){ feld[y][x]='X'; } else{ } if(y<0){ y=0; } else if(y>9){ y=9; } else if(y<9 && y>0){ } else{ } feld[y][x]='X'; system("CLS"); for(unsigned int y=0;y<10;y++){ //Gibt das Spielfeld aus 0-9 if(y==0){ } else{ cout << "\n"; } for(unsigned int x=0;x<10;x++){ cout << feld[y][x]; } } } int main(){ int zahler=0, eingabe=0, y=0, x=0; pos_ausabe(zahler, y, x); do{ eingabe=getch(); switch(eingabe){ case taste::p_oben: y--; pos_ausabe(zahler, y, x); break; case taste::p_unten: y++; pos_ausabe(zahler, y, x); break; case taste::p_rechts: x++; pos_ausabe(zahler, y, x); break; case taste::p_links: x--; pos_ausabe(zahler, y, x); } }while(eingabe!=taste::esc); return 0; }Nur mit einer Sache bin ich nicht ganz zufrieden. Das der Array in der Funktion deklariert wird(und das jedes mal auf neue). Aber sonst läuft es.
Edit: wäre es sinnvoll den array mit New zu beschaffen und dann mit delete wieder freizugeben?
-
new und delete würde ich lassen. Man ist gut beraten darauf zu verzichten. Dein Array brauchst du übrigens gar nicht. Für Zeilen ungleich y kannst du einfach 10 mal '' und ein '\n' ausgeben. Bei der Zeile gleich y kannst du x mal ein '' ausgeben, gefolgt von einem 'X', gefolgt von x-1 mal '_' und einem '\n'.
Deine if-else-Kaskaden sind unnötig kompliziert und falsch. Besser wäre
if(x<0){ x=0; } else if(x>9){ x=9; } feld[y][x]='X';An der Stelle feld[y][x]='X'; muss x wegen des Codes davor zwischen 0 und 9 liegen, das brauchst du nicht doppelt abzufragen. Außerdem führt das dazu, dass dein 'X' verschwindet wenn du versuchst aus dem Feld zu laufen, was bestimmt nicht so gedacht war.
-
Okay danke
