andy_f hat eine Endlosschleife produziert (Split aus: "Uebung Arrays vergleichen...")



  • SeppJ Gibt es im Visual Studio einen C-Compiler und wenn wo? Habe schon überlegt, auf meiner Linuxpartition mit Elipse zu arbeiten.

    Jetzt zu meinem nächsten Problem. bin gerade dabei Kofferpacken zu programmieren und hab ne Endlosschleife produziert. Krieg auch den "spieler_cpu" mit Zufallszeichen nicht hin. Vielleicht kann ja mal jemand drüberschauen.

    #include <stdio.h>
    #include <stdlib.h>
    
    void main(void)
    {
    	srand(time(0)*time(0));
    	int nochmal, x = 0, y = 0;
    	int spieler_zahl;
    	int spieler1, spieler2, spieler_cpu;
    	int counter = 0;
    	char koffer[62];
    	char eingabe, zufall;
    
    	spieler_zahl = rand() % 3 + 1;
    	//spieler1 = 1;
    	//spieler2 = 2;
    	//spieler_cpu = 3;
    
    	/*
    	Zufaellige Auswahl zwischen spieler1 und spieler2
    	Ausgewählter Spieler kann zwischen dem anderen Spieler und spieler_cpu auswählen
    	Der spieler_cpu gibt zufällige Zeichen ein(A-Z, a-z, 0-9)
    	*/
    
    		printf("Bitte erstes Utensil eingeben: ");
    		scanf_s("%c", &koffer[0], 1);
    		fflush(stdin);
    		x++;
    
    		while (x == 1)
    		{
    			printf("%i bitte alle Utensilien wiederholen: ", spieler_zahl);
    			counter = 0;
    		}
    		while (counter < koffer)
    		{
    			fflush(stdin);
    
    			eingabe = getch();
    			printf("%c ", eingabe);
    			if (koffer[counter] != eingabe)
    			{
    				fflush(stdin);
    				printf("%s hat gewonnen.\n", spieler_zahl + 1);
    				x = 0;
    				break;
    			}
    			counter++;
    		}
    		printf("\n");
    		if (x == 1)
    		{
    			printf("Was kommt dazu? ");
    			fflush(stdin);
    			koffer[x] = getch();
    			printf("%c\n", koffer[x]);
    			fflush(stdin);
    			x++;
    			spieler_zahl + 1;
    		}
    		printf("\nAnderer Spieler am Zug (Weiter mit Enter)\n");
    		getchar();
    		fflush(stdin);
    		system("cls");
    
    }
    

  • Mod

    andy_f schrieb:

    SeppJ Gibt es im Visual Studio einen C-Compiler

    Ja.

    und wenn wo?

    Keine Ahnung. Ich kann dir nicht beibringen, wie du deine Werkzeuge benutzt.

    Jetzt zu meinem nächsten Problem. bin gerade dabei Kofferpacken zu programmieren und hab ne Endlosschleife produziert. Krieg auch den "spieler_cpu" mit Zufallszeichen nicht hin.

    Mach für neue Fragen neue Threads auf!

    Vielleicht kann ja mal jemand drüberschauen.

    Der Compiler ist ein guter Kandidat, um eine erste Analyse von Codes abzugeben. Kann garantiert auch Visual Studio, aber du musst schon selber rausfinden, wie man Warnungen aktiviert. Hier ist, was GCC mit vollen Warnungen zu deinem Code zu sagen hat:

    test.c:4:6: warning: return type of 'main' is not 'int' [-Wmain]
     void main(void)
          ^
    test.c: In function 'main':
    test.c:6:8: warning: implicit declaration of function 'time' [-Wimplicit-function-declaration]
      srand(time(0)*time(0));
            ^
    test.c:26:3: warning: implicit declaration of function 'scanf_s' [-Wimplicit-function-declaration]
       scanf_s("%c", &koffer[0], 1);
       ^
    test.c:35:18: warning: comparison between pointer and integer
       while (counter < koffer)
                      ^
    test.c:39:14: warning: implicit declaration of function 'getch' [-Wimplicit-function-declaration]
        eingabe = getch();
                  ^
    test.c:44:12: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]
         printf("%s hat gewonnen.\n", spieler_zahl + 1);
                ^
    test.c:59:4: warning: statement with no effect [-Wunused-value]
        spieler_zahl + 1;
        ^
    test.c:12:16: warning: unused variable 'zufall' [-Wunused-variable]
      char eingabe, zufall;
                    ^
    test.c:9:26: warning: unused variable 'spieler_cpu' [-Wunused-variable]
      int spieler1, spieler2, spieler_cpu;
                              ^
    test.c:9:16: warning: unused variable 'spieler2' [-Wunused-variable]
      int spieler1, spieler2, spieler_cpu;
                    ^
    test.c:9:6: warning: unused variable 'spieler1' [-Wunused-variable]
      int spieler1, spieler2, spieler_cpu;
          ^
    test.c:7:22: warning: unused variable 'y' [-Wunused-variable]
      int nochmal, x = 0, y = 0;
                          ^
    test.c:7:6: warning: unused variable 'nochmal' [-Wunused-variable]
      int nochmal, x = 0, y = 0;
    

    Viele davon sind ziemlich dicke Hauer, die korrigiert werden müssen. Weiterhin ist fflush(stdin) unportabler Mist. Bei so vielen Fehlern habe ich mir die logische Struktur des Programms gar nicht angesehen. Da ist so viel falsch, dass es sowieso neu geschrieben werden sollte.



  • andy_f schrieb:

    while (x == 1)
            {
                printf("%i bitte alle Utensilien wiederholen: ", spieler_zahl);
                counter = 0;
            }
    

    Wo wird da x verändert?

    Sonst gibt es noch den Debugger. Nettes Werkzeug.
    Du kannst zur Fehlersuche auch ein paar printf mit Statusangaben in den Code einbauen.



  • Wenn ich das noch Recht in Erinnerung habe, macht VS das von der Datei-Endung abhängig, welcher Compiler verwendet wird.

    .c -> C Compiler
    .cpp -> C++ Compiler

    Meine Hand würde ich dafür jetzt aber nicht unbedingt ins Feuer legen.



  • NotSure Hast Recht. Und da ich bei "neues Element hinzufügen" (zum Projekt) die Dateiendung beim erstellen immer auf .c kürze, ist alles im Lot.

    Gut, jetzt bin ich zumindest so weit, dass die Verzweigung für Mensch gegen Mensch funktioniert. Werd die Nacht versuchen die Verzweigung mit dem Spieler 2 als CPU zu realisieren. Wenn der Spieler gewinnt, soll der Schwierigkeitsgrad der CPU in 3 Stufen erhöht werden. Die CPU soll zufaellig 0-9, A-Z und a-z eingeben und beim merken Fehler produzieren. Erhoeter Schwierigkeitsgrad. Jippieh...
    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h> //Anweisung system("cls") - Bildschirm leeren;
    #include <conio.h>
    #include <time.h>
    #include <Windows.h> //Sleep();
    
    void main(void)
    {
    
    	int aktiverSpieler = 1, i = 0, x = 0, richtigeEingabe = 1, Koffer[50];
    	int zufall, fehlerquote, computerlevel = 1;
    	char dump, wahl;
    
    	printf("Spieler 2 (C)PU oder (S)pieler?\n");//Auswahl Spieler
    	fflush(stdin);
    	scanf_s("%c", &wahl, 1);
    
    	if (wahl == 'c' || wahl == 'C')
    	{
    		printf("Spieler 2 wird von CPU gespielt.\n");
    
    		//Hier kommt die CPU rein...
    	}
    	else
    	{
    		if (wahl == 's' || wahl == 'S')
    		{
    			printf("Spieler 2 ist ein Mensch.\n");
    			//}
    			//}
    
    			if (wahl == 's' || wahl == 'S')
    			{
    				Koffer[i] = getchar();
    				do
    				{
    					printf("Spieler %i bitte %i. Stueck einpacken: ", aktiverSpieler, i + 1);
    					Koffer[i] = getchar();
    					Sleep(1000);
    					system("cls");
    					i++;
    					aktiverSpieler = aktiverSpieler * (-1) + 3;
    					printf("Spieler %i bitte Kofferinhalt aufzaehlen\n\n", aktiverSpieler);
    
    					for (x = 0; x < i; x++)
    					{
    						printf("Bitte %i. Position eingeben:\t", x + 1);
    						dump = _getch();
    						printf("%c\n", dump);
    						if (Koffer[x] != dump)
    						{
    							richtigeEingabe = 0;
    							break;
    						}
    						fflush(stdin);
    					}
    				} while (richtigeEingabe == 1);
    				system("cls");
    
    				printf("\n\nSpieler %i hat verloren.\n\n", aktiverSpieler);
    				printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    				printf("\t\t\t\t\t\t\tSpieler %i hat gewonnen.\n\n\n\n\n", aktiverSpieler * (-1) + 3);
    				printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    				_getch();
    
    			} while (richtigeEingabe == 1);
    		}
    		else
    		{
    
    		}
    	}
    }
    

    Für Anregungen und Tipps bin ich wie immer dankbar.

    Greetz Andy



  • DirkB Mit dem Debugger arbeite ich schon und erkenne auch schon einige Fehlermeldungen bzw. kann sie beheben. printf-Ausgaben zum ueberpruefen ist ne gute Idee. Haltepunkte setzen geht auch. So sehe ich, bis zu welchem Punkt die Programmierung funktioniert.


  • Mod

    Rückgabetyp von main ist immer noch nicht int.

    Immer noch massig unbenutzte Variablen. Offensichtliches Zeichen für Chaos im Code. Du hast den Überblick über dein eigenes Programm verloren und weißt selber nicht mehr genau, was wofür da ist. Das gilt natürlich erst recht für fremde Leute, die deinen Code verstehen wollen. Oder für dich selber, wenn du nach einer Woche den Code noch einmal anguckst. Eine klare Aufteilung von Code in logische Untereinheiten mit genau abgegrenzter Funktionalität hilft dagegen wahre Wunder.



  • SeppJ Die noch ungenutzten Variablen sind für den 2. Spieler als CPU gedacht - Zufallsgenerator + Schwierigkeitsgrad + das merken der CPU mit Fehlern. Rueckgabetyp werd ich sofort in int aendern. Vergess ich immer wieder...

    Ok, funktioniert irgendwie nicht wie gedacht, muss nochmal komplett überarbeiten...



  • Ich bin schon etwas älter und habe schon einige Koffer gepackt, dieses Schrottprogramm erschließt sich mir aber nicht, weder der Inhalt noch die Umsetzung.
    Du ignorierst die dir gegebenen Hinweise und pfuscht weiter vor dich hin und C-Codetags benutzt du auch nicht; du bist es nicht wert, dass sich jemand mit dir befasst.


Log in to reply