Wie Einträge in mehrdimensionalem Array "dynamisch/variabel" vergleichen?



  • Wobei man meinen Algorithmus natürlich optimieren könnte.

    namespace algorithm
    {
    	template<typename iterator_type, typename element_type>
    	std::pair<bool, iterator_type> find_chain(iterator_type first, iterator_type last, element_type const & element, const std::size_t size)
    	{
    		for (iterator_type it(first); (it + size) < last; ++it)
    		{
    			iterator_type it_chain(it);
    			for (; (it_chain != (it + size)) && *it_chain == element; ++it_chain);
    			if ((it + size) == it_chain) return std::make_pair<bool, iterator_type>(true, it);
    			it = it_chain;
    		}
    		return std::make_pair<bool, iterator_type>(false, first);
    	}
    }; // algorithm
    

    z.B. sollte schon um einiges bessere Durchlaufzeiten haben ...



  • Ich habe mir jetzt nochmal die Methode, die mir am Einfachsten erscheint herausgesucht. Ich hatte es aber auch schon einmal so probiert. (Nicht grad verwunderlich: ) Es funktioniert nicht.

    #include <iostream>
    using namespace std;
    
    int main(void) {
    	char Feld[3][3] = {
    		{'-', '-', '-',},
    		{'-', '-', '-',},
    		{'-', '-', '-',},
    	};
    
    	for (int x = 0; x < 3; x++) {
    		for (int y = 0; y < 3; y++) {
    			cout << Feld[x][y] << ' ';
    		}
    		cout << '\n';
    	}
    
    	if (Feld[x][y] == Feld[x+1][y]) {
    		cout << "Funktioniert";
    	}
    
    	cin.get();
    	return 0;
    }
    

    Der Compiler (aktueller MinGW) sagt folgendes, aus dem ich nicht recht schlau werde:

    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP: In function `int main()':
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:18: error: name lookup of `x' changed for new ISO `for' scoping
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:11: error:   using obsolete binding at `x'
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:18: error: `y' was not declared in this scope
    


  • int x und int y sind nur innerhalb der for-Schleife gültig.
    Machs so:

    int x, y;
    for (x = 0; ... usw. usw.



  • So wie ich das sehe, würde es aber vermutlich mehr Sinn machen, die if-Abfrage in die innere Schleife zu bewegen.
    Edit: dann darf x aber nicht bis 2 gezählt werden, da 2+1 über das Array hinaus geht.



  • Vielen Dank für die bisherige schnelle Hilfe, aber:

    Irgendwie klappt das alles noch nicht ganz optimal. Wenn ich die Ausgabe in die äußere Schleife setze, bleibt die Fehlermeldung. Bei der inneren ergibt sich die folgende Ausgabe:

    - Funktioniert- Funktioniert- Funktioniert
    - Funktioniert- Funktioniert- Funktioniert
    - - -
    

    Doch das ist ganz und gar nicht was ich will. Kann ich nicht irgendwie deklarieren, dass die erste eckige Klammer die Variable x und die zweite die Variable y bekommt. Quasi so in der Art:

    char Feld[x][y]
    

    Sodass ich dieses x und y mit rechungen (z.B. x+1) überall ausführen kann.



  • Dein Programm:

    #include <iostream>
    using namespace std;
    
    int main(void) {
        char Feld[3][3] = {
            {'-', '-', '-',},
            {'-', '-', '-',},
            {'-', '-', '-',},
        };
    	int x, y;
    
    	for (x = 0; x < 3; x++) {
            for (y = 0; y < 3; y++) {
                cout << Feld[x][y] << ' ';
            }
            cout << '\n';
        }
    
        if (Feld[x][y] == Feld[x+1][y]) {
            cout << "Funktioniert";
        }
    
        cin.get();
        return 0;
    }
    


  • Vielen Dank für die Hilfe. Bei mir gabs immer ein Fehler und Windows wollte ein Problembericht senden. Dabei hatte ich es fast genau so... (Ich hab blöderweise in der for-Schleife nochmal "int x..." geschrieben. Naja...)
    Komischerweise gibt es keine Ausgabe mit "Funktioniert". Nur das Spielfeld mit

    ---
    ---
    ---
    

    Dabei müsste es doch so korrekt sein. Oder steh ich jetzt irgendwie volle Kanne auf dem Schlauch?



  • #include <iostream>
    using namespace std;
    
    int main(void) {
        char Feld[3][3] = {
           /*entspricht Feld[0][0],Feld[0][1] und Feld[0][2]*/ {'-', '-', '-',},   
           /*entspricht Feld[1][0],Feld[1][1] und Feld[1][2]*/ {'-', '-', '-',},
           /*entspricht Feld[2][0],Feld[2][1] und Feld[2][2]*/ {'-', '-', '-',},
        };
    	int x, y;
    
    	for (x = 0; x < 3; x++) {
            for (y = 0; y < 3; y++) {
                cout << Feld[x][y] << ' ';
            }
            cout << '\n';
        }
        // an dieser Stelle, nach Verlassen der Schleife, ist x = 3 und y = 3 
        // Feld[3][3]  gibts nicht - weil ausserhalb der Feldgrenzen!
    
    	x=1; y=2;  // wäre ok
    
    	if (Feld[x][y] == Feld[x+1][y]) {
            cout << "Funktioniert";
        }
    
        cin.get();
        return 0;
    }
    

    😉



  • Vielen Dank für die Antwort!
    Doch leider gibts für mich jetzt ein neues Problem: Jetzt kann ich durch diese Anweisung ja nicht mehr überprüfen, ob irgendwo in dem Array zweimal das gleiche Zeichen hintereinander kommt, sondern nur an einer (bzw. mehreren) bestimmten Stelle, oder?



  • Fellhuhn schrieb:

    Schaut in data ob in einer der "Zeilen" "needed" mal "search" hintereinander vorkommt (sollte es zumindest):

    int data[10][10];
    int needed = 3;
    int search = 7;
    
    bool success = false;
    for(int x = 0; x < 10; ++x){
      for(int y = 0; y < 10 - needed; ++y){
        success = true;
        for(int k = 0; k < needed; ++k){
          if (data[x][y+k] != search){
             success = false;
             break;
          }
        }
        if (success) break;
      }
      if (success) break;
    }
    

Anmelden zum Antworten