Olá pessoal, estou com um pouco de dificuldade com lógica de programação.
A ideia é simples, transformar o valor "123456789012345" em uma array{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}
Inicialmente pensei em realizar várias divisões:
i = (teste / 100000000000000);
valores[0] = i;
Serial.println(valores[0]); // 1
i = ((teste - (i*100000000000000)) / 10000000000000);
valores[1] = i;
Serial.println(valores[1]); // 2
Mas isso parece uma gambiarra tão grande, que fiquei desconfortável.
Alguém teria uma alternativa?
Tags:
Boa noite TM,
Uma dúvida?
está usando arduino Uno/Mega/ESP8266/ESP32.........?
Arduino (8 bits) o maior numero é 0xFF FF FF FF = 4.294.967.295.
No ESP8266/32 é 0xFF FF FF FF FF FF FF FF = > 1.152.921.504.606.846.975
Use módulo (%) que facilita tudo.
Se não estiver conseguindo dá um grito de help aqui.
Testa este sketch aqui.
RV
Bom dia M.RV
Eu não tinha conhecimento sobre este teto, mas fiquei surpreso pois a divisão estava funcionando, ainda que, caso eu printasse, aparecia o ovf.
Para fugir deste meu código feio, criei um "for" , entretanto, caso haja um "0" no meio dos números, o algorítimo bugava, talvez devesse procurar como obter o número de caracteres da variável, e depois comparar. Isso poderia "resolver", mas ainda acho que seria uma gambiarra.
Atualmente estou utilizando o Arduino Uno, mas hoje devo receber o esp8266 e o esp32 (Se os correios colaborarem). O segundo será usado no protótipo devido a necessidade das telas de LCD TFT (Já fui avisado da maior dificuldade em programar, entretanto, por ser protótipo, tenho que ter um teto para gastos - depois irei posteriormente devo abrir um tópico sobre).
Quanto ao seu código, bem melhor que o meu. hahahaha. fiquei na duvida quanto ao numero de caracteres, mas 2 ou 3 rotinas a mais, não irá gerar lentidão. Ao chegar em casa, irei testa-lo.
Oi TM,
A IDE do Arduíno suporta só números maiores que 32 bits "emulativamente"..
Para emular o suporte de números maiores que isto, faz-se necessário o uso do
data type long long ou int64_t, que são equivalentes.
Ao tentar imprimir um numero definido com este data type, você vai ter a seguinte mensagem de erro:
" call of overloaded 'println(long long unsigned int&)' is ambiguous"
ou
" call of overloaded 'println(uint64_t&)' is ambiguous ".
Para conseguir imprimir, veja o recurso que usei no skectch abaixo.
Quando você define um numero com 64 bits, a IDE do Arduíno faz uma manobra e cria
um algorítimo pra trabalhar o numero.
Mas isto consome muita memoria.
Este programa que estou anexando, só por mudar a definição de 32 bits para 64 bits,
cresceu em 398 bytes.
Se usar long para executar, a IDE vai truncar o numero:
123456789012345 em HEX = 7048 860D DF79
unsigned long numero = 123456789012345;
Serial.println(numero,HEX); imprimiu 860DDF79 Veja que perdeu os dois primeiros bytes.
860DDF79 = 2249056121.
Serial.println(numero); imprimiu 2249056121
RV
O código que usei anteriormente está em anexo. Ele funciona com os oito primeiro dígitos. Depois embola tudo (provavelmente, pelo teto do arduino).
Já o seu código "Matriz_1", funcionou impecavelmente até o valor de "4294967295" (que é o teto do arduino, mas o código é bem melhor que o meu).
Com relação a mensagem de ambiguidade, eu iria pesquisar hoje, pois já tinha visto algo quando coloquei um long double, ou algo assim, e colocava para printar.
Sobre o "Numero_to_Matriz2.ino", a parte do buffer eu não entendi paçocas. Claramente preciso ler algo sobre. Mas teve algo que me despertou uma certa curiosidade. Inicialmente ele imprime os valores, mas o "0", que está entre o "9" e o "1", não aparece. O que ocorre aqui?
Isso não interfere na funcionalidade, pois o mais importante é armazenar os valores na matriz. Mas fiquei com isso na cabeça.
Bom dia TM,
realmente existe um erro não previsto.
Mas vc entenderá porque o zero desaparece.
O processo separa o numero em 2 partes e imprime cada parte em separado,
mas na primeira impressão não muda de linha.
1a. parte imprime 123456789
2a parte deveria imprimir 012345, mas como zero á esquerda o serial print suprime,
fica assim 12345, resultando em 12345678912345.
Mude a linha 13, de Serial.print(buffer); para Serial.println(buffer); e entenderá .
RV
Obrigado M.RV. Questões sanadas! =)
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por