Feld aus "Unterfunktion" an Main übergeben



  • Hi Leute,

    ich bin neu hier im Forum und wollte Euch zunächst herzlich begrüßen! Nun, ich bin dabei als Testataufgabe ein "Spiel des Lebens" in C++ zu programmieren.

    Dazu muss ich in einer "Unterfunktion" Werte einlesen und diese dann an die Hauptfunktion übergeben.
    Ich versuche das nun seit gut 8h zu realisieren.

    Wie ich von der Main an eine "Unterfunktion" Felder übergebe, hab ich herausgefunden. Wie das andersrum sauber funktioniert, weiß ich leider noch nicht.

    Mein (ganz einfacher) Testansatz schaut nun folgendermaßen aus:

    //Uebung
    
    #include <iostream>
    #include <fstream>
    #include <conio.h>
    #include <stdlib.h>
    using namespace std;
    
    void einlesen (int spielfeld [12][12]);
    
    int main(){
    
    	int spielfeld [12][12];
    	int zeile, spalte;
    
    	einlesen(spielfeld);
    
    	for ( zeile = 0; zeile < 12; zeile++ ){
    		for ( spalte = 0; spalte < 12; spalte++ ){
    			cout.width(3);
    			cout << spielfeld[zeile][spalte] << " ";
    		}
    	cout << endl;
    	}
    
    	getch();
    
    }
    
    void einlesen (int spielfeld [12][12]){
    
    	for ( int zeile = 0; zeile < 12; zeile++ ){
    
    		for ( int spalte = 0; spalte < 12; spalte++ ){
    
    			spielfeld [zeile][spalte] = 18;
    
    		}
    
    	}
    
    }
    

    Wenn ich das jetzt in Bloodshed DEV-C++ kompiliere und direkt ausführe bekomme ich als Ausgabe nur 12*12 L ausgegeben. Öffne ich die kompilierte .exe allerdings über den Explorer, wird mir ein 12*12 18er Feld ausgegeben. Ich gehe davon aus, dass meine Methode nicht sauber ist.

    Könnt ihr mir sagen, was ich besser machen kann?

    Vielen Dank im Voraus!

    Grüße
    Snirg0r 👍


  • Mod

    Verstehe ich das richtig, du bekommst einmal so etwas wie

    L    L    L
    L    L    L
    L    L    L
    

    (als 12x12)
    und ein anderes Mal

    18   18   18
    18   18   18
    18   18   18
    

    (auch als 12x12)

    ?

    Das ist doch sehr, sehr merkwuerdig und wird vermutlich ein Fehler in deiner IDE oder deinem Gesamtsstem sein. An sich ist dein Programm nicht falsch.



  • Ja, genau richtig verstanden! Ich habe den Code jetzt auch in mein Hauptprogramm übernommen und er scheint zu funktionieren...

    Was meinst du mit IDE? Die Dateien liegen auf meiner SSD, die über S-ATA angeschlossen ist. 🙂 --- ist sicherlich irrelevant, da das ja im RAM ausgeführt wird, oder?

    Danke derweil für die Hilfe! Momentan hänge ich daran, meine in das Feld eingelesenen Zahlen in Zeichen umzuwandeln. Ich baue also eine Art Übersetzer.

    Es werden "Einsen" und "Nullen" eingelesen in ein Feld, das ich als char deklariert habe:

    for (int i = 1; i < 11; i++) {
           for (int k = 1; k < 11; k++) {
               if (spielfeld [i][k] = 1) {
               spielfeld [i][k] = '*';
    		   }
    		   if (spielfeld [i][k] = 0) {
    		   spielfeld [i][k] = ' ';
    		   }
    	   }
       }
    

    Alle Einsen sollen zu * werden und alle Nullen zu Leerzeichen. Auf die Art bekomme ich allerdings ein leeres Feld. Ratschläge?

    Gut gelaunt und optimistisch,

    Snirg0r


  • Mod

    IDE = integrated development environment = Entwicklungsumgebung. Dein Bloodshed DEV-C++.

    Ein Vergleich in C++ ist "==". Hingegen ist "=" eine Zuweisung. Du weist also jedem deiner Felder erst den Wert 1 zu, denn den Wert '*' (da die Zuweisung von 1 den Rückgabewert 1 hat und daher das if anspringt) und daraufhin den Wert 0 zu (und dann keine Zuweisung von ' ', da die Rückgabe der Nullzuweisung 0 ist und das if daher nicht anschlägt).

    Selbst mit diesem Hinweis sieht dein Programm noch sehr wirr aus. Was ist denn nun Spielfeld? Eine Nutzereingabe oder die interne Datentstruktur oder eine Repräsentation zur Ausgabe der internen Datentstrukturen? Irgendwie scheint es ein bisschen was von allem gleichzeitig zu sein.



  • Also es werden entweder Zahlen vom Nutzer eingespeist, oder eine Textdatei mit Zahlen eingelesen. Anhand dieser Zahlen entwickeln sich dann bestimmte Bilder, nach bestimmten Regeln.

    Zum Beispiel:
    1. Ein leeres Element des Feldes geht in eine Eins über, wenn genau zwei oder drei Nachbarelemente eine Eins haben.

    2. Ein 1er Element wird zu einer 0, wenn weniger als eines oder mehr als drei seiner Nachbarelemente eine 1 haben.

    und so weiter. Das ganze soll dann über ein paar Iterationsschritte hinweg betrieben werden, die der Nutzer bestimmt.

    Danke für deine Hinweise. Ja, dass das für dich wirr aussieht, kann ich mir vorstellen. Ich bin Anfänger, das ist, neben den Übungen, mein erstes "richtiges" Programm.

    Ich versuch mal den Übersetzer zu verbessern.



  • Mein Übersetzer funktioniert nun. 🙂

    Hier mein Code, falls es später noch mal jemanden interessiert:

    //Funktion uebersetzen
    int uebersetzen (char spielfeld [12][12]){
    
    	for (int i=1; i<11; i++){
    		for (int k=1; k<11; k++){
    			if (spielfeld[i][k] != '0' && spielfeld[i][k] != '1'){
    				cout << endl << endl;
    				cout << "Bitte gueltige Werte einspeisen. Es sind nur 0 und 1 zulaessig." << endl;
    			}			
    			if (spielfeld[i][k] == '1'){
    				spielfeld[i][k] = '*';
    			}
    			if (spielfeld[i][k] == '0'){
    				spielfeld[i][k] = ' ';
    			}
    		}
    	}
    //getch();	
    }
    

    Danke für die Hilfe!

    Jemand ne Idee, wie ich es besser machen kann - damit ich nicht für jede falsch eingegebene Zahl eine "Bitte gueltige Werte einspeisen. Es sind nur 0 und 1 zulaessig."-Meldung bekomme? Es würde mir ja reichen, wenn er bei der ersten falschen Zahl abbricht und die Meldung ausspuckt. Achja, dass ich nur Elemente jeweils von 1 bis 11 in die Schleife einbinde, hat seine Richtigkeit - in meinem Anwendungsfall.

    Grüße,
    Snirg0r



  • snirg0r schrieb:

    damit ich nicht für jede falsch eingegebene Zahl eine "Bitte gueltige Werte einspeisen. Es sind nur 0 und 1 zulaessig."-Meldung bekomme? Es würde mir ja reichen, wenn er bei der ersten falschen Zahl abbricht und die Meldung ausspuckt.

    //Funktion uebersetzen
    int uebersetzen (char spielfeld [12][12]){
        boolean fehler = false;
    
        for (int i=1; i<11; i++){
            for (int k=1; k<11; k++){
                if (spielfeld[i][k] != '0' && spielfeld[i][k] != '1'){
                    cout << endl << endl;
                    cout << "Bitte gueltige Werte einspeisen. Es sind nur 0 und 1 zulaessig." << endl;
                    fehler = true;
                    break;
                }          
                if (spielfeld[i][k] == '1'){
                    spielfeld[i][k] = '*';
                }
                if (spielfeld[i][k] == '0'){
                    spielfeld[i][k] = ' ';
                }
            }
            if(fehler)
              break;
        }
    //getch(); 
    }
    


  • Feine Sache, danke Dir!

    Es gab da ein kleines Problem mit dem boolean am Anfang, ich hab es einfach umgeändert und so funktioniert es:

    //Funktion uebersetzen
    int uebersetzen (char spielfeld [12][12]){
    	bool fehler = false;
    
    	for (int i=1; i<11; i++){
    		for (int k=1; k<11; k++){
    			if (spielfeld[i][k] != '0' && spielfeld[i][k] != '1'){
    				cout << endl << endl;
    				cout << "Bitte gueltige Werte einspeisen. Es sind nur 0 und 1 zulaessig." << endl;
    				fehler = true;
    				break;
    			}			
    			if (spielfeld[i][k] == '1'){
    				spielfeld[i][k] = '*';
    			}
    			if (spielfeld[i][k] == '0'){
    				spielfeld[i][k] = ' ';
    			}
    		}
    		if (fehler)
    			break;
    	}
    //getch();	
    }
    

    Super Forum!


Log in to reply