Pointer Problem!?!



  • Hier meine Frage

    Ich habe eine Frage...in der Funktion wird ein Array gefüllt. Muss ich den Pointer wieder zurück an die Main geben?

    Und wenn ja muss ich ihn dann befor ich ihn zurückgebe wieder auf 0 setzen...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int fuellen(int *spielfeld){
      int i=0,p=1,j=0,a=1;
      while (i<8){
        while(j<8)
        {
          *spielfeld=p;
          printf("X Koordinate: %d ",*spielfeld);
          if(a==9)
    	a=1;
          spielfeld++;
          *spielfeld=a;
          printf(" Y Koordinate: %d\n",*spielfeld);
          a++;
          spielfeld++;
          spielfeld++;
          spielfeld++;
    
          j++;
        }
          p++;
          i++;
          j=0;
      }
      return(0);
    }
    
    int main (){
     int i=0;
    int spielfeld[256]={0};
    int *bla=NULL;
    fuellen(spielfeld);
    bla=&spielfeld[i];
    printf("X Koordinaten %d", *bla);
    }
    

    Wenn ich am Ende des Arrays bin (256) kann ich mit der folgenen Zeile dann den Pointer wieder auf den Anfang setzen?

    spielfeld=spielfeld-256
    


  • Sinnvoll: Problembeschreibung stehen lassen und Lösung posten. Dann haben auch andere was davon. Das Forum ist schließlich für alle da. Außerdem besteht ja die Möglichkeit, dass deine Lösung suboptimal ist und du trotzdem noch ein paar nützliche Tipps bekommst.

    Nicht so sinnvoll: was du gerade gemacht hast. 😉

    EDIT: Ok, jetzt hast du's wieder zurückeditiert, was meinen Post irgendwie aus dem Zusammenhang reißt. 😃



  • Hehe ja sry ich hab den Thread einfach wieder benutz weil mein Fehler nur ein Denkfehler war dachte das bringt keinem was...meine Grundfragen sind aber geblieben 😃



  • Odatas schrieb:

    Ich habe eine Frage...in der Funktion wird ein Array gefüllt. Muss ich den Pointer wieder zurück an die Main geben?

    Nein, mit dem Zeiger hast du ja die Adresse des Arrays übergeben und schreibst direkt dorthin. Daher ist eine Rückgabe überflüssig. Der Zeiger existiert ja schon an der aufrufenden Stelle.

    Odatas schrieb:

    Und wenn ja muss ich ihn dann befor ich ihn zurückgebe wieder auf 0 setzen...

    Ähm, nein!

    Odatas schrieb:

    Wenn ich am Ende des Arrays bin (256) kann ich mit der folgenen Zeile dann den Pointer wieder auf den Anfang setzen?

    spielfeld=spielfeld-256
    

    Du kannst selbstverständlich mit Zeigern rechnen, wie du es ja auch schon getan hast. Allerdings macht eine Subtraktion von 256 keinen Sinn. Dein Bereich geht von 0-255. Wenn du auf dem letzten Element bist, darfst du also nur 255 abziehen, um wieder bei 0 zu landen.



  • Ok Danke für die Antworten



  • _matze schrieb:

    Du kannst selbstverständlich mit Zeigern rechnen, wie du es ja auch schon getan hast. Allerdings macht eine Subtraktion von 256 keinen Sinn. Dein Bereich geht von 0-255. Wenn du auf dem letzten Element bist, darfst du also nur 255 abziehen, um wieder bei 0 zu landen.

    Das hängt natürlich davon ab, wie weit er gezählt hat. Meist ist man nach der letzten Operatiorn durch das spielfeld++ auch einen Schritt weiter. Somit sind die 256 schon richtig.
    Am einfachsten ist es aber sich den Zeiger am Anfang zu merken.



  • So dann fällt mir grad noch was auf:

    if (*spielfeld==1 && *spielfeld++==1)
    

    Ich denke mal so funzt das nicht. Aber was ich erreichen will ist das die If Schleife nur greift wenn der Inhalt eins ist und er dann schaut ob im nächsten Array Element der INhalt auch 1 ist.

    Wie könnte man das machen?

    if (*spielfeld++==1 && *spielfeld==1)
    

    Würde das gehen? Ich hatte mal im Sinn das er bei dieser eingabe erst vergleicht und dann ein weiterschaltet?



  • if(*(spielfeld+1) == 1 && *spielfeld == 1)
    

    😕



  • Das *spielfeld++ greift erst auf *spielfeld zu und danach wird spielfeld erhöht.
    Wenn dann wäre *(++spielfelfd) nötig, da dort erst spielfeld erhöht und dann an der neuen Stelle der Wert geholt wird.

    Ein Problem ist auch, das C nicht unbedingt den gesamten Ausdruck auswertet.
    Wenn bei (*spielfeld==1 && *spielfeld++==1) *spielfeld != 1 ist, ist der Ausdruck sowieso false und somit wird *spielfeld++==1 gar nicht mehr überprüft.

    Also nimm den Vorschlag von pyhax



  • Ich hab das jetzt nochmal ein bischen anders gemacht.

    Also ich arbeite grad ein einer einfachen KI weil ich das Eimerspiel programmiere mit meiner Gruppe. Das aber nur für die die wissen was das ist.

    Die KI soll die Felder je nachdem welche eigenschafften das Feld hat wird es anders bewertet.

    Es geht jetzt hier um die Funktion "schwer". Ein Feld in dem Spiel besteht aus vier Informationen die nacheinander in dem Array eingetragen sind...

    X Koordinate bei spielfeld[0]
    y Koordinate bei spielfeld[1]
    Füllstand (Erstmal unwichtig) bbei spielfeld[2]
    Wem gehört das Feld bei Spielfeld[3]

    Die nächsten INfos des Spielfelds stehe direkt dahinter. So sind 4 Int Arrays immer für ein Feld im Array.

    Die Funktion Füllen haut ja x und y Werte rein. Der Rest bleibt erstmal 0

    EDIT: Zur bewertung: Eckfelder bekommen 2 Punkte Randfelder 1 Punkt und Mittenfelder 0 Punkte.

    Felder des Gegners -1000 Punkte eigene Felder 0 Punkte und Felder die niemanden gehören -100 Punkte.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int fuellen(int *spielfeld){
      int i=0,p=1,j=0,a=1;
      while (i<8){
        while(j<8)
        {
          *spielfeld=p;
          if(a==9)
    	a=1;
          spielfeld++;
          *spielfeld=a;
          a++;
          spielfeld=spielfeld+3;
          j++;
        }
          p++;
          i++;
          j=0;
      }
      return(0);
    }
    
    int schwer(int *spielfeld){
      int bewertung[64]={0};
      int *pointer=&bewertung[0];
      int i=0;
      while (i<64) /*Jede x und y Koordinate des Felds*/
      {
        if (*spielfeld==1 || *spielfeld==8)/*Wenn die x Koordinate eine 1 oder eine 8 ist gibt es ein Punkt (Rand oben oder unten am SPielfeld)*/
          *pointer=*pointer+1;
        spielfeld++;/*Schaltet auf die Y Koordinate*/
        if (*spielfeld==1 || *spielfeld==8)/* Wie oben mit y Koordinate (Rand links oder Rechts) Ecken haben so automatisch 2 Punkte bekommen*/
          *pointer=*pointer+1;
        spielfeld=spielfeld+2;/*Weiterscheiten auf den Wert im Array der sagt wem das Feld gehört*/
        if (*spielfeld==3)/* Wert 3 steht für Computer wenn es ihm gehört gibts nochmal +2*/
          *pointer=*pointer+2;
        if (*spielfeld==1)
          *pointer=*pointer-1000;/* Wenn es dem Gegenspieler gehört gibt es -1000 in der Bewertung*/
        else
          *pointer=*pointer-100;/*Ansonsten gibt es -100 also wenn es niemanden gehört*/
        pointer++;
        i++;
      }
      i=0;
    
      while(i<64)
     {
       printf("Feld %d hat den Wert %d\n",i+1, bewertung[i]);/* Bei der Ausgabe merke ich aber das es für einzelnde Felder nicht funktioniert*/
     i++;
     }
    return(0);
    }
    
    int main (){
     int spielfeld[256]={0};
     int i=0;
     fuellen(spielfeld);
     schwer(spielfeld);
    }
    

    Ersmtal danke an alle die sich die Mühe machen hier erstmal reinzulesen 😃



  • Odatas schrieb:

    X Koordinate bei spielfeld[0]
    y Koordinate bei spielfeld[1]
    Füllstand (Erstmal unwichtig) bbei spielfeld[2]
    Wem gehört das Feld bei Spielfeld[3]

    Da steigst du doch in einer Woche selber nicht mehr durch.
    Nimm dafür eine struct und mach damit das Array.



  • Ich habe meine Fehler gefunden. Ich habe vergessen nachdem ich mir ankucke wem das Feld gehört wieder einmal weiter zu schalten also so das anstatt die nächste While schleife mit der x koordinate wieder anfängt...sie mit dem Besitz feld anfängt.

    Nach Zeile 46 gehört noch ein:

    spielfeld++;
    


  • DirkB schrieb:

    Odatas schrieb:

    X Koordinate bei spielfeld[0]
    y Koordinate bei spielfeld[1]
    Füllstand (Erstmal unwichtig) bbei spielfeld[2]
    Wem gehört das Feld bei Spielfeld[3]

    Da steigst du doch in einer Woche selber nicht mehr durch.
    Nimm dafür eine struct und mach damit das Array.

    Doch doch das klappt schon. Keine Angst 😉

    Prbolem mit dem struct ist das wir den Start des Projektes schon hatte bevor wir struct in der Vorlesung hatten. Und als es dan drankam hatten wir schon das Grundgerüst usw...jetzt alles auf struct umstellen wäre eine Heiden Arbeit...wir sind ja fast schon fertig 😃



  • Odatas schrieb:

    Ich habe meine Fehler gefunden. Ich habe vergessen nachdem ich mir ankucke wem das Feld gehört wieder einmal weiter zu schalten also so das anstatt die nächste While schleife mit der x koordinate wieder anfängt...sie mit dem Besitz feld anfängt.

    und

    Odatas schrieb:

    Doch doch das klappt schon. Keine Angst 😉

    Was für ein Widerspruch.

    Da brauche ich gar keine Argumente mehr für ein struct.
    Die hast du ja selber schon geliefert. 🙂



  • Beim nächsten Projekt nehm ich dann bestimmt struct 😉



  • Ich habe jetzt eine ganze andere Sache...

    Ich will aus einer Funktion in die ein Array rein geht 2 Int ausgeben und in der main damit danntoll Dinge machen aber:

    return(x,y)
    

    bringt da nichts....x und y werden nicht übergeben...



  • Anstatt einfach wild rumzuprobieren, solltest du dir ein Buch oder wenigstens Tutorial schnappen und mal ein wenig Grundlagen pauken. Dann wüsstest du, dass du nur einen Wert zurückgeben kannst. Es gibt aber Ausweichmöglichkeiten (z.B. Rückgabe eines struct, call by reference).



  • Ja sry in meinem Buch habe ich grad beim Nachschlagen den Satz "Man kann immer nur eine Variable pro Funktion zurückgeben" in dem 20000 Zeichen langen Kapitel wohlnicht gefunden...

    Danke Trozdem



  • Odatas schrieb:

    Ja sry in meinem Buch habe ich grad beim Nachschlagen den Satz "Man kann immer nur eine Variable pro Funktion zurückgeben" in dem 20000 Zeichen langen Kapitel wohlnicht gefunden...

    Danke Trozdem

    Gib halt ein Array zurück.



  • Im Gegensatz zu structs kann man Arrays immer noch nicht zurückgeben.


Anmelden zum Antworten