SteckHalma Spiel: Funktionswert & Parameter an Unterfkt übergeben



  • Hey community,

    ich bin mittlerweile schon recht weit beim Programmieren meines SteckHalma Spiels gekommen, stoße allerdings beim compilieren und bei einigen kleinen Sachen doch an meine Grenze.
    Dennoch bin ich noch ein kleiner Neuling. Das Programmieren ist von der Uni aus.

    Compiler-Fehlermeldung:

    eingeben.c:28: Warnung: Verarbeiten des Argumentes 1 von »im_feld« von inkompatiblem Zeigertyp

    Zeile 27:

    var=im_feld(spielfeld,zeile, spalte);

    Die Funktion im_feld wurde uns gegeben, liegt also als object-datei bereits im selben Verzeichnis.

    Der Rückgabewert dieser ist '1' für Spielzug ist im Spielfeld und analog dafür '0' nicht im Spielfeld.

    spielfeld ist ein Array: spielfeld[9][9]
    (also Zeile, Spalte)

    Der Quellcode

    #include <stdio.h>
    
    int eingeben (void)
    {
    
            int abbruch, fehler, zeile, spalte, zrichtung, srichtung, var;
            int im_feld (int spielfeld[9][9], int zeile, int spalte);
            char richtung,spielfeld[9][9];
    
    abbruch=0; fehler=0;
    
            do {
    
            //Spalte und Zeile wählen
            printf("Bitte wähle einen Stein.\n");
            printf("Welche Spalte?\n");
            scanf ("%i" ,&spalte);
            getchar();
            printf("Welche Zeile?\n");
            scanf("%i" ,&zeile);
    
                    if (zeile!=0) //Überprüfen ob Eingabe Zeile gleich Null
                    {
    
                            //Überprüfen ob Feld im Spielfeld und Stein auf Feld
    
                            var=im_feld(spielfeld,zeile, spalte);
    
                            if (spielfeld[zeile][spalte]==1 && var==1)
    
                            {
    
                            printf("In welche Richtung solls gehen?\n");
                            printf("(o - oben, u - unten)\n (l - links, r - rechts)\n");
                            scanf("%c", &richtung); //richtung wählen
                            zrichtung=0;
                            srichtung=0;
    
                                    switch (richtung) //spezifische Richtungsangaben
                                    {
                                            case 'o':
                                            case 'O': zrichtung=-1; break;
    
                                            case 'u':
                                            case 'U': zrichtung=1; break;
    
                                            case 'l':
                                            case 'L': srichtung=-1; break;
    
                                            case 'r':
                                            case 'R': srichtung=1; break;
    
                                            default: printf ("Falsche Richtungseingabe!\n");
                                    }
    
                            } else  //Fehlermeldung
                                    { printf("Entweder befindet sich auf dem gewählten Feld ein Stein oder\n");
                                      printf("das gewählte Feld ist ausserhalb des Spielfeldes. ");
                                    }
                            //Richtungswahl o,O,u,U,l,L,r,R?
                            if (richtung=='u' || richtung=='U' || richtung=='o' || richtung=='O' || richtung=='l' || richtung=='L' || richtung=='r' || richtung=='R')
    
                            {
    
                                    ////Überprüfen, ob Zielfeld im Spielfeld
                                    if (im_feld[spielfeld][zeile+2*zrichtung][spalte+2*srichtung]==1 && spielfeld[zeile+2*zrichtung][spalte+2*srichtung]==0 && spielfeld[zeile+zrichtung][spalte+srichtung]==1)
    
                                    {
    
                                            spielfeld[zeile][spalte]=0;
                                            spielfeld[zeile+zrichtung][spalte+srichtung]=0;
                                            spielfeld[zeile+2*zrichtung][spalte+2*srichtung]=1;
                                            fehler=0;
    
                                    }else
                                            {
                                                    printf("Das gewählte Feld liegt nicht im Spielfeld!");
                                            }
    
                            }
    
                    }       else abbruch=1;
    
            } while (fehler!=1 && abbruch!=0);
    
    }
    

    2. Problem:

    Mein Tutor sagte mir, dass ich das Array spielfeld in main definieren und dann als Parameter an seine Unterfkt. weitergeben muss.

    Geht das dann einfach so?

    // Funktion 'eingeben' aufrufen
    eingeben(spielfeld);

    Wie initialisiere ich dann in der Unterfunktion spielfeld?

    Ich hoffe meine Problemstellung ist klar geworden. Falls nicht einfach nachfragen.

    Grüße, Benni



  • spielfeld[][] ist int, also sollte spielfeld[][] auch int sein. 🙂

    (...)
     int im_feld (int spielfeld[9][9], int zeile, int spalte);
    // char richtung,spielfeld[9][9];
     char richtung;
     int spielfeld[9][9];
    (...)
    


  • Hi,
    den Prototypen in Zeile 8

    int im_feld (int spielfeld[9][9], int zeile, int spalte);
    

    schreibt man gewöhnlich nicht innerhalb einer Funktion, sondern irgendwo oben an den Anfang der Datei, damit auch eventuell andere Funktionen etwas davon haben und wegen der Übersicht.

    eingeben.c:28: Warnung: Verarbeiten des Argumentes 1 von »im_feld« von inkompatiblem Zeigertyp

    Einfach nur den Datentypen anpassen, du übergibst einen char, wo ein int gefragt ist.

    psychodelic schrieb:

    Mein Tutor sagte mir, dass ich das Array spielfeld in main definieren und dann als Parameter an seine Unterfkt. weitergeben muss.
    ...
    Wie initialisiere ich dann in der Unterfunktion spielfeld?

    In der main schreibst du

    int spielfeld[9][9]={0};
    

    Das initialisiert alle Elemente mit 0. Wenn das Array mit anderen Werten initialisiert werden soll, dann kannst du das mit zwei Schleifen machen.
    Die Funktion int eingeben (void) muss dann noch geändert werden in
    int eingeben (int spielfeld[9][9]), damit du den Parameter übergeben kannst.
    Dann schmeißt du noch die btw. fälschlicher Weise als char spielfeld[9][9]
    deklarierte Variable komplett aus der Funktion eingeben raus.
    Jetzt kannst du das Array mit dem Aufruf eingeben(spielfeld); von der main Funktion aus übergeben.
    Gruß,
    B.B.



  • Vielen Dank!

    Jetzt funktioniert alles! 🙂

    Grüße, Benni


Anmelden zum Antworten