iterar por meio de valores em uma matriz de strings para imprimir

Eu (acho que) estou tentando iterar através dos valores de uma matriz e imprimir a string em um tft . Eu declarei a matriz de 4 strings e isso funciona bem. Mas quando tento imprimir, recebo lixo. Estou perdendo uma nuance de impressão? Ou eu simplesmente não entendo como usar arrays e strings …?

O código é o seguinte:

Declarações:

//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off" 

Use (observe a declaração if falsa para a pergunta)

 if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); } 

Em vez disso, recebo caracteres aleatórios na maioria das vezes, às vezes nada.

Caso seja uma coisa de memória, saiba que:

O Sketch usa 26.480 bytes (92%) do espaço de armazenamento do programa. O máximo é 28.672 bytes. Variáveis globais usam 1.126 bytes (43%) de memória dinâmica, deixando 1.434 bytes para variáveis locais. O máximo é 2.560 bytes.

Comentários

  • Talvez a taxa de transmissão esteja errada? Ou o activeSystem é maior que 3 e sai dos limites?
  • ^ Bingo. Eu não entendi o activeSystem.
  • Não percebi o quão rápido ele fazia um loop e durava milissegundos. então progrediu através de um monte de lixo cuspindo memória por todo o caminho. Cara, eu me sinto estúpido agora

Resposta

Se a variável activeSystem excede o comprimento da matriz, está fora dos limites, ponto no qual o comportamento é indefinido.
No seu caso, você obtém “dados inúteis”, que na verdade são apenas dados na memória após a matriz.

Como não há verificação implícita dos limites da matriz, você mesmo precisa verificá-los.

Resposta

I acho que esta é a maneira correta de criar uma matriz de strings C:

 char * hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; char * displayActiveSystem = hvacSystems[activeSystem]; if(systemNeedsToBeCycled){ activeSystem++; // make sure to set a bound for this variable displayActiveSystem = hvacSystems[activeSystem]; tft.print(displayActiveSystem); } 

Uma vez que as strings são basicamente armazenadas como ponteiros de caracteres, uma matriz de strings é uma matriz de variáveis char *. Ou você pode criar uma matriz de strings do Arduino:

 String hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; if(systemNeedsToBeCycled){ activeSystem++; // make sure to set a bound for this variable displayActiveSystem = hvacSystems[activeSystem]; tft.print(displayActiveSystem); } 

Resposta

Não tenho certeza se entendi 100%, mas aqui está minha melhor chance. Se o seguinte estiver errado, o problema não é devido à falta de memória. Tente isto

//Active System char hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; // or char hvacSystems[4] = {"Off", "Fan", "Cool", "Heat"} int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off" if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); } 

Sua linha

char hvacSystem s [4] [5] = {“Desligado”, “Ventilador”, “Legal”, “Calor”};

Você está tentando criar um array bidimensional aqui. Basicamente, uma mesa 4×5. Com o seu código, se você fizer

tft.print (hvacSystems [0] [1]);

Ele deve dar a você “Desligado”. Basicamente, você fez uma tabela que se parece com

0 {“Off”, “Fan”, “Cool”, “Heat”, null}

1 {null, null, null, nulo, nulo}

2 {nulo, nulo, nulo, nulo, nulo}

3 {nulo, nulo, nulo, nulo, nulo}

Matrizes : https://www.arduino.cc/en/Reference/Array 2d Matrizes:

http://forum.arduino.cc/index.php?topic=220385.0

Comentários

  • Não compilará sem a segunda dimensão ou sem dimensão. O que faz sentido se você considerar que uma string é uma matriz de char ‘ s [4] [5] 0 {” O “, ” F “, ” C “, ” H “} 1 {” f “, ” a “, ” o “, ” e “} 2 {” f “, ” n “, ” o “, ” a ” } 3 {” / 0 “, ” / 0 “, ” l “, ” t } 4 {null, null, ” / 0 “, ” / 0 “}

Resposta

O o problema não parece ser o que você pensa, porque não posso reproduzi-lo.

Veja isto:

//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem; bool systemNeedsToBeCycled = true; void setup () { Serial.begin (115200); Serial.println (); displayActiveSystem = hvacSystems[activeSystem]; // <-- Should now be String "off" Serial.println (displayActiveSystem); if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; // <-- Should now be String "Fan" Serial.println (displayActiveSystem); } } // end of setup void loop () { } // end of loop 

Resultado :

Off Fan 

Poste um esboço completo que reproduza o problema. O posicionamento das variáveis e seu tipo podem influenciar o resultado.

Usei Serial.println () para mostrar o conteúdo das variáveis, que é o que você esperava.


Possivelmente funcionará melhor:

tft.print(displayActiveSystem.c_str ()); 

Comentários

  • enquanto você foi prejudicado pela minha falta de código , o problema estava lá. activeSystem era ilimitado e indexava áreas inválidas de hvacSystems após 3 loops. Os loops são executados tão rápido que perdi os dados válidos no início.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *