Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Arduin: Aula9

Estou recebendo essa mensagem de erro no meu codigo e não sei o motivo gostaria de ajuda: O codigo em questão

C:\Users\rosec\OneDrive\Documentos\Arduino\teste\teste.ino: In function 'sequencia()':

C:\Users\rosec\OneDrive\Documentos\Arduino\teste\teste.ino:49:23: warning: iteration 4 invokes undefined behavior [-Waggressive-loop-optimizations]

     sequenciaLuzes[i] = sorteiaCor();

     ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~

C:\Users\rosec\OneDrive\Documentos\Arduino\teste\teste.ino:48:18: note: within this loop

   for (int i=0; i<=tamanhoSequencia; i++){

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':

C:\Users\rosec\OneDrive\Documentos\Arduino\teste\teste.ino:49:23: warning: iteration 4 invokes undefined behavior [-Waggressive-loop-optimizations]

     sequenciaLuzes[i] = sorteiaCor();

                       ^

C:\Users\rosec\OneDrive\Documentos\Arduino\teste\teste.ino:48:18: note: within this loop

   for (int i=0; i<=tamanhoSequencia; i++){

                  ^

O codigo em questão:

#define ledVerde1 11
#define ledAmarelo 10
#define ledVermelho 9
#define ledVerde2 8

#define botVerde1 5
#define botAmarelo 4
#define botVermelho 3
#define botVerde2 2

#define tamanhoSequencia 4
int sequenciaLuzes[tamanhoSequencia];
int rodada = 0;

enum ESTADOS{
  usuarioRespondendo,
  prontoProx,
  fimJogoVitoria,
  fimJogoPerda
};


void setup(){
  iniciaPortas();
  sequencia();

}

void iniciaPortas(){
  pinMode(ledVerde1,OUTPUT);
  pinMode(ledAmarelo,OUTPUT);
  pinMode(ledVermelho,OUTPUT);
  pinMode(ledVerde2,OUTPUT);

  pinMode(botVerde1,INPUT_PULLUP);
  pinMode(botAmarelo,INPUT_PULLUP);
  pinMode(botVermelho,INPUT_PULLUP);
  pinMode(botVerde2,INPUT_PULLUP);

  Serial.begin(9600);
}


void sequencia(){
  int porta = analogRead(A0);
  randomSeed(porta);

  for (int i=0; i<=tamanhoSequencia; i++){
    sequenciaLuzes[i] = sorteiaCor();
  }
}


int sorteiaCor(){
  return random(ledVerde2,ledVerde1 + 1);
}




void loop(){
  switch(estados()){
    case usuarioRespondendo:
    Serial.println("O usuario esta respondendo.");
    break;

    case prontoProx:
    Serial.println("Pronto para a proxima rodada");
    preparaProxRodada();
    break;

    case fimJogoVitoria:
    Serial.println("Fim de Jogo, voce venceu");
    break;

    case fimJogoPerda:
    Serial.println("Fim de Jogo, voce predeu");
    break;
  }
  delay(500);
}


//estados-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

int estados(){
  if (rodada < tamanhoSequencia){
    return prontoProx;
  }else{
    return fimJogoVitoria;
  }
}

void preparaProxRodada(){
  rodada++;
  piscaSEQUENCIAled();
}









//controle dos botões-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


void controleBotoes(){
  if (digitalRead(botVerde1) == LOW){
    piscaLed(ledVerde1);
  }
  else if (digitalRead(botAmarelo) == LOW){
    piscaLed(ledAmarelo);
  }
  else if (digitalRead(botVerde2) == LOW){
    piscaLed(ledVerde2);
  }
  else if (digitalRead(botVermelho) == LOW){
    piscaLed(ledVermelho);
  }
}




//sequencia de leds-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void piscaSEQUENCIAled(){
  for (int i=0; i<rodada; i++){
    piscaLed(sequenciaLuzes[i]);
  }
}






void piscaLed(int led){
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led,LOW);
  delay(500);
}
1 resposta
solução!

Oi Michael, como você está?

Na função sequencia, a instrução for está rodando uma vez a mais do que o preestabelecido, isso por causa do sinal de menor ou igual. O correto é apenas menor.

Anteriormente definimos que a variável sequenciaLuzes(que está dentro do for) terá um tamanho de 4 posições, certo?

#define tamanhoSequencia 4
int sequenciaLuzes[tamanhoSequencia];

Porém, em seu código, na instrução for, essa variável está sendo preenchida 5 vezes, pois o for começa do 0 e está indo até o valor 4, portanto, 5 valores. Mas, o desejado é apenas 4 valores, pois o tamanho da sequência são 4 valores. Com isso, o nosso for irá do valor 0 até o valor 3.

Diante disso, para corrigir o erro que ocorre em seu código, basta que modifique a instrução for para ir até o valor menor que o tamanho da sequência, retirando o sinal de igual:

void sequencia(){
  int porta = analogRead(A0);
  randomSeed(porta);

  for (int i=0; i< tamanhoSequencia; i++){
    sequenciaLuzes[i] = sorteiaCor();

  }
}

Após essa mudança, tente executar novamente o programa.

Qualquer dúvida é só falar, vamos conversando. Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software