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 dehvacSystems
após 3 loops. Os loops são executados tão rápido que perdi os dados válidos no início.