• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
komenda goto a poprawność programu
#1
Poniżej wstawię kod niedziałającego programu. Jest to gra której założenie jest następujące: wybieramy czy chcemy dodawać czy odejmować, program generuje dwie losowe liczby dodaje je do siebie i sprawdza czy wynik jest zgodny z tym co wprowadziliśmy do komputera. W zależności od poprawności przyznaje nam lub nie przyznaje punkt. Ze względu na podwójne wyświetlenie na monitorze portu wyniku oraz fakt że program nie czeka na wprowadzenie odpowiedzi podejrzewam że niepoprawnie wykorzystałam komendę goto. Prosiłabym o znalezienie błędu lub wskazanie gdzie może się znajdować.
Kod:
String odebraneDane = "";
String odebraneDane2 = "";
//int zakres = "";
  int punktyuzyskane;
  int rundy = 0;
  int wprowadzona;
void setup(){
  Serial.begin(9600);
  randomSeed(analogRead(0));
 
}
void loop() {
 label3:
   if(Serial.available() > 0){
      //int zakres = Serial.read();
      rundy = rundy + 1;
       Serial.println("runda:" );
       Serial.println(rundy);
       Serial.println( );
       delay(1000);
       //goto label4;
   }else{
       goto label3;
       }{
   int zmienna1 = random(10, 100);
   int zmienna2 = random(10, 100);
   Serial.println(zmienna1);
   delay(1000);
   Serial.println(zmienna2);
   delay(1000);
   label:
   if (odebraneDane == "+"){
     delay(100);
     label1:
   if(Serial.available() > 0){
      odebraneDane2 = Serial.read();
     
   int zmienna3 = zmienna1+zmienna2;
   if (odebraneDane2 == zmienna3)
   {
     Serial.println(zmienna3);
     Serial.println("podałeś poprawny wynik");
     punktyuzyskane = punktyuzyskane+1;
     Serial.println("liczba punktów:");
     Serial.println(punktyuzyskane);
     
   }else{
     Serial.println(zmienna3);
     Serial.println("podałeś błędny wynik");
     Serial.println("liczba punktów:");
     Serial.println(punktyuzyskane);
     Serial.println( );
   }
   
 }
   }else{
   delay(100);
   goto label1;
   }
       
        if (odebraneDane == "-")
{
   int zmienna1 = random(10, 100);
   int zmienna2 = random(10, 100);
   Serial.println(zmienna1);
   delay(1000);
   Serial.println(zmienna2);
   delay(1000);

   if(Serial.available() > 0){
      odebraneDane2 = Serial.readStringUntil('\n');
   int zmienna3 = zmienna1-zmienna2;
   Serial.println(zmienna3);
   Serial.println( );
   }else{
   delay(1000);

   }
 
 }else{
 delay(1000);
 goto label;

 }
}
}
 
Odpowiedź
#2
Po pierwsze:
Kod:
if (odebraneDane2 == zmienna3)
To zawsze będzie false, ponieważ porównujesz string do int.

Powinno być:
Kod:
if (odebraneDane2.toInt() == zmienna3)

Po drugie:
Instrukcja goto już dawno nie istnieje w standardzie C/C++. Jest zaimplementowana jej obsługa ze względu na kompatybilność wsteczną kodu. Nie zaleca się stosowanie tej instrukcji ze względu na ekstremalnie niską czytelność kodu.
Podejrzewam, że sama nie wiesz o co chodzi w tym programie.
Można wykorzystać zwykłe pętle i będzie prościej, oraz przejrzyściej.
Ja pozwoliłem sobie przepisać Twój kod. Wywaliłem instrukcje goto. Bez żadnej optymalizacji, testów i odpalania tego na Ardu, mogę stwierdzić, że na pewno działa. Nie jest to piękny kod, bo pisałem po pijaku, ale wszystko jest przejrzyste i zrozumiałe, nawet bez komentarzy.

Kod:
String odebraneDane = "";
String odebraneDane2 = "";
//int zakres = "";
int punktyuzyskane;
int rundy = 0;
int wprowadzona;
void setup(){
    Serial.begin(9600);
    randomSeed(analogRead(0));

}
void loop() {
    
             if(Serial.available() > 0){
                 odebraneDane = Serial.readStringUntil('\n');
        
                   if (odebraneDane == "+"){
                                   //int zakres = Serial.read();
                                   rundy = rundy + 1;
                                   Serial.println("runda:" );
                                   Serial.println(rundy);
                                   Serial.println( );
                                   delay(1000);
                                   
                                       int zmienna1 = random(10, 100);
                                   int zmienna2 = random(10, 100);
                                   Serial.print(zmienna1);
                                   Serial.print(" ");
                                   Serial.print(odebraneDane);
                                   Serial.print(" ");
                                   Serial.print(zmienna2);
                                   Serial.print(" = ");
                                   odebraneDane="";
                                  while(1){
                                               if(Serial.available() > 0){
                                            odebraneDane2 = Serial.readStringUntil('\n');
                                                    int zmienna3 = zmienna1+zmienna2;
                                                         if (odebraneDane2.toInt() == zmienna3)
                                                         {
                                                             Serial.println(zmienna3);
                                                             Serial.println("podales poprawny wynik");
                                                             punktyuzyskane = punktyuzyskane+1;
                                                             Serial.println("liczba punktow:");
                                                             Serial.println(punktyuzyskane);
                                                   break;
                                                             }else{
                                                             Serial.println(zmienna3);
                                                             Serial.println("podales bledny wynik");
                                                             Serial.println("liczba punktow:");
                                                             Serial.println(punktyuzyskane);
                                                             Serial.println( );
                                                   break;
                                                         }
                         
                                                     }
                                  }
                       }

                       if (odebraneDane == "-"){
                                   //int zakres = Serial.read();
                                   rundy = rundy + 1;
                                   Serial.println("runda:" );
                                   Serial.println(rundy);
                                   Serial.println( );
                                   delay(1000);
                                   
                                   int zmienna1 = random(10, 100);
                                   int zmienna2 = random(10, 100);
                                   Serial.print(zmienna1);
                                   Serial.print(" ");
                                   Serial.print(odebraneDane);
                                   Serial.print(" ");
                                   Serial.print(zmienna2);
                                   Serial.print(" = ");
                                   odebraneDane="";
                                  while(1){
                                       if(Serial.available() > 0){
                                            odebraneDane2 = Serial.readStringUntil('\n');
                                           int zmienna3 = zmienna1-zmienna2;
                                                 if (odebraneDane2.toInt() == zmienna3)
                                                 {
                                                   Serial.println(zmienna3);
                                                   Serial.println("podales poprawny wynik");
                                                   punktyuzyskane = punktyuzyskane+1;
                                                   Serial.println("liczba punktow:");
                                                   Serial.println(punktyuzyskane);
                                                   break;
                                                   }else{
                                                   Serial.println(zmienna3);
                                                   Serial.println("podales bledny wynik");
                                                   Serial.println("liczba punktow:");
                                                   Serial.println(punktyuzyskane);
                                                   Serial.println( );
                                                   break;
                                                 }
                         
                                               }
                                  }
                 }
              }
    }
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Dziękuję za odpowiedź! Brak wykorzystania pętli i kompresji string to int wyjaśniają problemy. Mając gotowy kod będę mogła zrozumieć jak program działać powinien.
 
Odpowiedź
#4
Ja np. jestem ze starej szkoły BASICA i goto bardzo mi podchodzi !!
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości