zweidimensionales array1 im zweidimensionales array2 speichern



  • Stringterminierung. Die '\0' fehlt am Ende deiner Teilstrings.

    Auch solltest du size_t für einen Variablennamen nicht verwenden. Das ist unübersichtlich.
    Wozu brauchst du die Variable i, wenn die einzige Verwendung ein sety=i; ist?

    Von den Zeilen 41 bis 43 sollten auch zu Testzwecken immer nur eine aktiv sein.
    Wobei du in Zeile 42 entweder zuviele Paramter oder eine falsche Funktion hast.

    Der Index bei Arrays fängt in C immer bei 0 an. (Zeile 48)
    Schau dir mal den Modulo-Operator % an.



  • Hmm...
    das mit dem memcpy geht nicht, ich möchte lab auch nicht 3 dimensional haben.
    ich komme da irgendwie nicht weiter.
    Das mit size_t kann sein das ich das von einer anderen Stelle habe. Das habe ich jetzt mal in laenge geändert.


  • Mod

    Dave1990 schrieb:

    Hmm...
    das mit dem memcpy geht nicht

    Warum?

    , ich möchte lab auch nicht 3 dimensional haben.

    Dann mach es 2D. Deine Beschreibung klang so, als hättest du mehrere 6x6-Arrays.



  • so sieht die txt aus

    L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww
    L4=wwwwbwwskkkwwwkwswwskwwwwwkkswwwwwww
    L5=wwwbwwwskkkwwwwwswwskwwwwwkkzwwwwwww
    L6=wwwbwwkskkkwwwkwswwskwwwwwkkzwwwwwww
    L1=wwwbwwwskkkwwwkwswwskwwwwwkkzwwwwwww
    L2=wwwwwwwwwswkkkswwkwkwzwwwkkkwwswbkwwswkwwkkkkwkwwswwkkkwwwwwwwww
    

    Das sind Quadratische Labyrinthe. Der Nutzer sagt jetzt 1,2,3,4,5 oder 6. Dann wird 1 der 6 ausgewählt und gelöst. Es funktioniert auch alles bis auf das Einlesen der txt.
    Es soll sich bei der Auswahl auf den Namen bezogen werden,also wenn 1 ausgewählt wird soll L1 gelöst werden.
    dafür wollte ich namen[][] nutzen. Um das ganze zu lösen soll einfach das ausgewählte Array namen in lab umgewandelt werden, da meine lösungsrechnung sich auf diesen aufbau bezieht

    {"wwwbww",
    "wskkkw",
    "wwkwsw",
    "wskwww",
    "wwkkzw",
    "wwwwww"}
    

    ich hoffe jetzt ist verständlich was ich meine.
    zu memcpy.
    ich weiß nicht warum das nicht geht, ich kenne mich mit dieser funktion auch nicht aus 😉


  • Mod

    Dave1990 schrieb:

    so sieht die txt aus

    L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww
    L4=wwwwbwwskkkwwwkwswwskwwwwwkkswwwwwww
    L5=wwwbwwwskkkwwwwwswwskwwwwwkkzwwwwwww
    L6=wwwbwwkskkkwwwkwswwskwwwwwkkzwwwwwww
    L1=wwwbwwwskkkwwwkwswwskwwwwwkkzwwwwwww
    L2=wwwwwwwwwswkkkswwkwkwzwwwkkkwwswbkwwswkwwkkkkwkwwswwkkkwwwwwwwww
    

    Das sind Quadratische Labyrinthe. Der Nutzer sagt jetzt 1,2,3,4,5 oder 6. Dann wird 1 der 6 ausgewählt und gelöst. Es funktioniert auch alles bis auf das Einlesen der txt.
    Es soll sich bei der Auswahl auf den Namen bezogen werden,also wenn 1 ausgewählt wird soll L1 gelöst werden.
    dafür wollte ich namen[][] nutzen. Um das ganze zu lösen soll einfach das ausgewählte Array namen in lab umgewandelt werden, da meine lösungsrechnung sich auf diesen aufbau bezieht

    {"wwwbww",
    "wskkkw",
    "wwkwsw",
    "wskwww",
    "wwkkzw",
    "wwwwww"}
    

    ich hoffe jetzt ist verständlich was ich meine.

    Dann erfüllt mein Beispiel nach kleiner Modifikation die Anforderungen. Verstehst du denn das Beispiel?

    zu memcpy.
    ich weiß nicht warum das nicht geht, ich kenne mich mit dieser funktion auch nicht aus 😉

    Wie weißt du dann, dass es nicht funktioniert? Wieso guckst du nicht einfach nach, was memcpy macht?



  • Wenn ich das Beispiel das test bekomme ich diese meldung

    Warnung: Übergabe des Arguments 2 von »memcpy« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert]
    

  • Mod

    Oh, wie gesagt, war ungetestet. namen[i]+3 oder &namen[i][3] (je nach Geschmack) muss das heißen.

    Lies dir mal mehr über Felder, Zeiger und die Standardbibliothek durch. Wenn du mit 2D-Arrays werkeln möchtest, musst du fit genug sein, um solche einfachen Fehler selber beheben zu können.



  • Also ungefähr so ?

    const char namenn[3][40]={"L1=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww",
                             "L2=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww",
                             "L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"};
      char labn[200][200];
      int i2;
      for(i2=3;i2<laenge;i2++){
          memcpy(&labn[getx][gety],&namenn[setx][i2],36);	 
          gety++;
          if (gety==(length)){
    		  printf("\n %c",labn[getx][gety]);	
    		  gety=0;
    		  getx++;
    	  }
     }
    

  • Mod

    Also ungefähr so ?

    Nein, überhaupt nicht. Jetzt hast du ja alles wieder eingebaut, was bei dir falsch war.



  • hmmm
    aber so füllt er ja
    alle werte von namenn[0] in labn[0] 😕
    und nicht
    namenn[0][0 bis 5]= labn[0][0 bis 5]
    namenn [0][6 bis 10]= labn[1][0 bist 5]
    usw...
    Ich habe mir das auch mal durchgelesen was die memcpy funktioniert
    http://www.cplusplus.com/reference/cstring/memcpy/
    aber irgendwie ist das momentan nicht so wie es soll 😞 😞



  • Wie bist du denn auf die 36 gekommen, bzw. weißt du warum du die da hingeschrieben hast?



  • 36 ist die größe von
    L1=..... sind ja 40 zeichen, in dem fall und ohne L1= sind es nur noch 36 Zeichen



  • Aber wieviel Zeichen willst du kopieren?
    36 waren es nicht.



  • nur 6 ?



  • Also jetzt bekomme ich schonmal die richtige ausgabe
    aber im Debugg Modus sehe ich das da noch viel Unsinn gemacht wir

    const char namenn[3][40]={"L1=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww",
                             "L2=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww",
                             "L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"};
      char labn[200][200];
      int i2;
      printf("\n");
      for(i2=2;i2<=laenge+1;i2++){
    
      //for(i2 = 3; i2 < 36; ++i2){
    	  //memcpy(&labn[0][i2], &namenn[0][i2], 36);
    	  memcpy(&labn[getx][gety],&namenn[setx][i2],6);
    	  //printf("\n%c",labn[i2][1][1]);
          gety++;
          printf("%c",labn[getx][gety]);
    	  if (gety==(length)){
    
    		  printf("\n");
    		  // printf("\n %c", namen[setx][sety]);
    		  gety=0;
    		  getx++;
    
    	  }
     }
    

    das ist dann meine ausgabe

    wwwwww
    wskkkw
    wwkwsw
    wskwww
    wwkkzw
    wwwwww
    

    ich denke das reich mir auch zum weiter arbeiten, aber irgendwie füllt das programm die lab mit mehr als 6 zeichen


  • Mod

    Dave1990 schrieb:

    36 ist die größe von
    L1=..... sind ja 40 zeichen, in dem fall und ohne L1= sind es nur noch 36 Zeichen

    So so. 40-3=36?

    Schreib niemals blind Code ab, ohne ihn zu verstehen. Ich habe doch extra noch

    SeppJ schrieb:

    Verstehst du denn das Beispiel?

    gefragt. Wenn du darauf nicht antwortest, dann gehe ich erst einmal von einem "Ja" aus.

    Bei mir hatte die 36 einen Sinn. Mit deinen Änderungen aber nicht mehr. Trotzdem blieb die 36.

    Wir müssen hier viel früher ansetzen. Die Musterlösung war offensichtlich nicht hilfreich, weil du sie nicht verstehst. Du musst erst einmal wirklich den Ratschlag

    SeppJ schrieb:

    Lies dir mal mehr über Felder, Zeiger und die Standardbibliothek durch. Wenn du mit 2D-Arrays werkeln möchtest, musst du fit genug sein, um solche einfachen Fehler selber beheben zu können.

    befolgen. Es macht ja keinen Sinn, etwas zu erklären, wenn du es nicht verstehst. Wenn du das gemacht hast und ein bisschen Erfahrung gesammelt hast (Mach das wirklich! Das ist kein Scherz!), dann gehst du systematisch an das Problem heran:
    - Genaue Formulierung der Problemstellung: Was hat man? Was möchte man erreichen?
    - Genaue Definition der nötigen Datenstrukturen.
    - Formulierung des Algorithmus, wie man mit Hilfe der Datenstrukturen von der Eingabe zu der gewünschten Ausgabe kommt.

    Dave1990 schrieb:

    aber irgendwie füllt das programm die lab mit mehr als 6 zeichen

    SeppJ schrieb:

    Ich habe hier mal stillschweigend angenommen, dass du nicht wirklich nullterminierte Zeichenketten in deiner Zieldatenstruktur haben möchtest.

    DirkB schrieb:

    Stringterminierung. Die '\0' fehlt am Ende deiner Teilstrings.

    Entscheide dich, was du haben möchtest. Du mischt gerade DirkBs Tipps mit meinen. Schlag Stichworte nach, wenn du sie nicht verstehst. Gründlich!



  • ja 36 weil das
    wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww
    Zeichen sind das ist aber mit 40 angegeben wegen L1= und am Ende ist immer noch \0
    also 40-4 wenn du es so haben willst
    ich hatte da nur einen kleinen Denkfehler
    ich habe halt noch nie Werte aus einer txt geholt und dann ein Array in das andere geschoben. der Rest ist schon klar



  • Ich habe jetzt eine Lösung.
    ist zwar unsauber aber ich kann damit weiter rechnen und das reicht mir auch.
    👍


  • Mod

    Dave1990 schrieb:

    Ich habe jetzt eine Lösung.
    ist zwar unsauber aber ich kann damit weiter rechnen und das reicht mir auch.
    👍

    Das finde ich nicht 👍 , sondern 👎 . Wenn dir unsaubere Lösungen reichen und du sogar noch damit zufrieden bist, wirst du damit später noch Probleme bekommen. Ich bin nicht hier, um dich zu erziehen, ich gebe dir diesen Kommentar nur mal so als Eigenerfahrung mit auf den Weg.



  • memcpy(&labn[0][0],&namen[0][3],6);
    memcpy(&labn[1][0],&namen[0][9],6);
    memcpy(&labn[2][0],&namen[0][15],6);
    memcpy(&labn[3][0],&namen[0][21],6);
    memcpy(&labn[4][0],&namen[0][27],6);
    memcpy(&labn[5][0],&namen[0][33],6);
    

    Das meine ich 😉

    das muss jetzt natürlich noch variable gemacht werden aber sonst kann ich damit weiter rechnen


Anmelden zum Antworten