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' 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' hin
    

    Danke!

    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 🙂


Anmelden zum Antworten