Olá a todos.

Estava desenvolvendo um código para fins de diversão. Durante o processo, percebi várias inconsistências/erros nos valores que eram exibidos no Serial Monitor. Sendo assim, reduzi o código ao "máximo" possível, mas que o erro pudesse ser reproduzido por outra pessoa.

Cenário 1:

linha 90 comentada == > // impressao();

Linha 96 SEM comentar ==> Serial.println(formacao_num[i]);

Exibido no monitor serial:

Cenário 2:

linha 90 SEM comentar == > impressao();

Linha 96 comentada ==> //Serial.println(formacao_num[i]);

Exibido no monitor serial:

Cenário 3:

linha 90 SEM comentar == > impressao();

Linha 96 SEM comentar ==> Serial.println(formacao_num[i]);

Exibido no monitor serial:

Observe que no void Setup(), primeiramente ele chama a função "converter()", que fará a execução da linha 96, para só DEPOIS fazer a chamada da função "impressao()" da linha 90.

Esta variação de resultados, não faz sentido para mim.

Estou utilizando a Arduino IDE V1.8.19, e a a versão da placa (na ide), é a 1.8.5.

Exibições: 308

Anexos

Responder esta

Respostas a este tópico

Resposta: é um problema de memória.

Solução: Otimizar código, ou usar um controlador com mais memoria ram.

" é um problema de memória.

Solução: usar um controlador com mais memoria ram."

Não concordo com isto.

veja o relatório ao compilar:

"Sketch uses 5022 bytes (16%) of program storage space. Maximum is 30720 bytes. Global variables use 1198 bytes (58%) of dynamic memory, leaving 850 bytes for local variables. Maximum is 2048 bytes."

Usa 16% de flash e 58% de RAM,

RV mineirin

RV, entretanto, ao fazer uma verificação de memória, eu obtive algo em torno de 140 bytes disponíveis.

Usei a lib freememory.h , ou memoryfree.h... algo assim.

No forum do arduino deram a dica para resolver o problema.

Usar  const char * hero_position[]  ao invés de String hero_position[] e

const char * formacao[11] ao invés de String  formacao[11] 

Testei e deu certo.

Testa ai com seu projeto.

RV mineirin

Olá, minerin!

   Bela oportunidade para mostrar as vantagens e desvantagens do C++ em relação ao C.

   O C++ facilita, entre outras, muitas coisas sob a ótica da programação descritiva, mas com o custo do aumento da complexidade.

   Este exemplo mostra que a classe String, apesar de muito poderosa, e endereçando um dos pontos fracos do C, que é o tratamento de strings, merece um cuidado maior para utilizar do que o simples array de caracteres do C, o que pode levar a secções de debug mais longas e dolorosas se o usuário não possuir uma respeitável experiência com o C++.

   Pessoalmente, para coisas simples, uso as ferramentas do C, deixando as tarefas mais elaboradas, por assim dizer, para o C++.

Abração!

D. T. Ribeiro.

Bom dia D.T. Ribeiro,

como a minha formação é em hardware, as vezes me complico com estes conceitos mais abstratos de software.

Estou aprendendo melhor usar Strings.

No forum do arduino, eles condenam muito o uso de strings do formato para a IDE do arduino.

E com o tempo estou realmente vendo a razão desta "condenação".

É mais fácil usar Sting xxxx = "abc",  mas parece que dá mais problemas em códigos mais complexos.

"   O C++ facilita, entre outras, muitas coisas sob a ótica da programação descritiva, mas com o custo do aumento da complexidade."

Voce pode me ensinar mais um pouco sobre isto?

um abração e obrigado.

RV mineirin   :-D

RV, você poderia postar este código? fiz alguns testes, mas não tive sucesso.

Inicialmente fiz apenas a mudança da declaração das variáveis. Ele retornou este erro:

C:\...\HeroWars_Exemplo.ino: In function 'int localizar_posicao(String)':
HeroWars_Exemplo:80:26: error: no match for 'operator==' (operand types are 'const char*' and 'String')
if (hero_position[i] == nome) {
~~~~~~~~~~~~~~~~~^~~~~~~
exit status 1
no match for 'operator==' (operand types are 'const char*' and 'String')

Ok, sem problemas, vamos na linha 80 fazer alteração de String para char ou const char.

Em todos os dois casos, não retornou erro. O uso de memória está de 8% e 41%, entretanto, ele imprime valores errados (torcendo para que o fórum, um dia, possa ter o <code>código</code> ):

128
128
154
128
135
128
128
128
128
128
92
(MainPet: 1920: - 1920(154: - 1920(135: - 1920(1920: - 1920(1920: - 1920(92:

toda via, a memória disponível, dessa vez, está em  1162 bytes, é uma diferença bem expressiva

Parei, refleti, e mudei novamente o localizar_posicao(), para "const char * nome". Tive sucesso.

utilizando o <MemoryFree.h>, fiz a chamada antes e depois do "impresssao()", tive 1182bytes livres. É uma diferença considerável.

Moral da história: Tem solução.

Observação: Não sei o que significa o asterisco em  "const char * nome", CELSO, certa vez me disse que era um "ponteiro", que referenciava a um "slot" na memória, ou algo assim. ele me explicou algumas vezes, mas não tive capacidade intelectual de entender isso kkkkk

Bom dia,

segue o Código.

HeroWars_Exemplo.ino

RV mineirin

Bom dia,

mas qual arduino?

RV mineirin

Arduino Uno R3

Boa tarde.

TM, postei uma versão modificada do seu Código no forum do arduino.

Fiz umas modificações, mas continua apresentando erros.

https://forum.arduino.cc/t/comparison-printing-wrong-values/1086556

RV mineirin

Obrigado pela iniciativa, as respostas foram bastante interessantes e curiosas.

Baseado no que você falou, e no que citei em outro post, o código final é este: https://pastebin.com/NTGEV18r

Irei analisar a ideia do PROGMEM, parece ser divertido.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço