Boa Noite Senhores,

Preciso retornar para a serial o valor de uma variável de acordo com seu nome.
Se tenho uma variável Int X e recebo pela serial um comando envia X eu quero imprimir o cabeçalho de identificação que é o mesmo nome do comando e o valor da variável. Porém eu teria que fazer uma espécie de Cast de string para variável.

Alguma sugestão?

Obrigado

Exibições: 174

Responder esta

Respostas a este tópico

bom dia Teodoro.

Não há como vincular uma string a uma variável de forma "natural".
Isto porque os nomes das variáveis, que são denominados "símbolos" no ambiente da linguagem, só existem no tempo de compilação.
Tais nomes são enumerados durante a compilação, e seu endereço final só é determinado pelo LINKER da Linguagem, quando o COMPILADOR inclusive já finalizou sua execução.
Neste ponto, o nome simbólico já nem mais existe, apenas seu endereço físico (determinado pelo LINKER).

Portanto, o que você quer fazer, só é possível de forma "não natural", ou seja, de forma forçada. E quem deve forçar isso, é você mesmo.
Ou seja, você deve estabelecer no seu código, um vínculo entre a variável e uma string que é idêntica ao nome da variável (símbolo).
Não sei com qual quantidade de variáveis você pretende trabalhar, mas uma maneira organizada e simples de fazer isso, seria criar um vetor "Nx2" (onde N é o número máximo de variáveis acessadas). Um dos elementos do vetor é uma string idêntica ao nome da variável, e o outro elemento é um Ponteiro genérico (ou especifico para o tipo da variável, caso você esteja trabalhando com apenas um tipo de variável). Então o ponteiro apontaria para a respectiva variável correspondente à string (o primeiro elemento do vetor). Esse apontamento pode ser feito por inicialização, ou usando ponteiros constantes. Note que aqui pode aparecer um "overhead": se você estiver trabalhando com diferentes tipos de variáveis, terá que usar um vetor "Nx3", e no terceiro elemento teria que armazenar o tipo da variável (de forma codificada), para que posteriormente possa identificar como tratar aquela variável.


A coisa então funcionaria assim: ao receber o nome da variável (juntamente com um eventual "comando"), você deve varrer o vetor, procurando a string que coincide com o nome da variável (recebido via terminal). Se você encontra a string no vetor, então basta usar o índice correspondente para acessar o Ponteiro daquele índice). Assim através deste Ponteiro, você acessa o valor da variável, e basta retornar este valor junto com as demais informações (nome, comando recebido, etc). Mas não se esqueça do "overhead" que mencionei, caso esteja trabalhando com diferentes tipos de variáveis.


Para criar o vetor, antes você pode definir uma STRUCT com dois elementos: uma string e um Ponteiro (genérico). Então é só declarar um vetor deste tipo de STRUCT. Outra forma "mais simples", é criar dois vetores do mesmo comprimento: um para a string e outro para o Ponteiro. No entanto apesar desta última forma ser inicialmente mais simples, ela é mais difícil de gerenciar ao longo do seu programa, já que o vínculo entre os dois vetores deve ser observado a todo instante. Particularmente, eu usaria um vetor da STRUCT, devido à maior facilidade de gerenciamento.

Claro que, se você estiver trabalhando com uma quantidade muito reduzida de variáveis, será mais óbvio fazer tudo isso com statements "if" (e bibliotecas próprias para comparação de strings), embora assim seu código fique menos "elegante".

Em qualquer caso, note que a associação da variável com a string, será sempre forçada (ou digamos, "artificial"), já que a ligação "real" se perdeu após a etapa de compilação e nem mesmo o LINKER conhece esta ligação (então quem dirá nós, pobres mortais usuários destas maravilhas do mundo da programação).

uma curiosidade: em linguagens de programação interpretadas (como por exemplo o BASIC do século passado), o vínculo do nome da variável com seu conteúdo, existe de forma contínua. Assim isso aparentemente abriria um precedente para fazer algo semelhante ao que você deseja. Mesmo assim, como isso não é o objetivo pensado para a programação (ou seja, para a linguagem), inevitavelmente você também teria que utilizar a técnica que descrevi acima.

Há tempos, escrevi um compilador/interpretador FORTH, e pelo pouco que me lembro, esta linguagem poderia ser uma exceção à regra, dado que os objetivos do FORTH são diferentes da infinita maioria ordinária de linguagens dos dias de hoje. Mas fiz isso há cerca de 24 anos atrás, e não tenho certeza de que o que você deseja seria natural de se fazer mesmo numa linguagem mais "alienígena" como FORTH.

Caso precise de alguma orientação adicional, fique à vontade,

abrçs,

Elcids

ah sim, esqueci de mencionar (embora seja meio óbvio), que na definição da STRUCT, haveria também o "overhead" de precisar ter um terceiro elemento que seria a codificação do tipo da variável, caso você esteja trabalhando com diferentes tipos. Talvez até mesmo um quarto elemento, que seria um Ponteiro constante para uma eventual função tipo "print", especializada em converter aquele tipo em string (a fim de enviar a resposta via terminal). E claro, se sua opção for por vetores separados, a quantidade de vetores seguiria a mesma lógica que acabei de descrever.

de  nada. Estamos aqui para ajudar, colaborar, e expandir nossas ideias.

Uma sugestão: caso você vá implementar o método mais "elegante" usando vetores de STRUCT (conforme mencionei), eu sugiro começar com um tipo único de variável, por exemplo o tipo "int" (como você mesmo mencionou no post inicial). Fazendo isso, vai ficar bastante fácil de implementar a técnica que mencionei, inclusive para a posterior "printagem" do conteúdo da variável (no processo de resposta via terminal). Então depois que estiver tudo funcionando redondinho, você acrescenta as informações e tratamento para outros tipos. Ou seja, você valida sua lógica/processo, e depois expande sua capacidade em termos de tipos de variáveis (claro, se isso for um objetivo). Isto pode ser uma grande "tentação", já que tratar tudo de uma vez só, pode ser um tanto indigesto.

abrçs

Elcids

ok Teodoro.

Fico feliz que vc tenha avançado no seu objetivo. Visitei o link que você postou do Stackoverflow, e realmente estão tratando praticamente da sua questão. O legal é que há também algumas divagações lá (como sobre o "evil dynamic loading", rsrsrs). Curiosamente, "a resposta" do "Alexey Frunze", como você deve ter percebido, é praticamente uma forma de implementação de algumas das técnicas que eu inicialmente descrevi para tentar te guiar no processo de resolução da questão.

Espero que você vá adiante com isto, pois certamente vai abrir mais possibilidades nas suas soluções com o Arduino, já que a interface do Arduino possui algumas limitações e por isso mesmo é às vezes criticada por pessoas que não compreendem seu real propósito (afinal todas as "Visuais IDEs" estão aí pra quem quiser usar).

abrçs

Elcids

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço