Problema com variáveis e parâmetros em função.

Olá pessoal. Estou trabalhando com uma tela de TFT LCD (ili9488 e uma "st_alguma_coisa" -- não faz diferença). Estou usando uma fonte de texto customizada e a lib tft_eSPI.

Tudo funciona perfeitamente, entretanto, uma característica que gerou nas fontes "customizadas" é a sobreposição das letras, isto é, os leds da tela não se apagam para depois reescrever. Tudo bem até ai. Para solucionar esta questão, criei uma função MUITO simples:

void imprimir(String Old, byte Xold, byte Yold, String Novo, byte Xnovo, byte Ynovo) {
tft.setTextColor(TFT_BLACK, TFT_BLACK);
if (Old != "") {
tft.setCursor(Xold, Yold);
tft.print(Old);
}
tft.setTextColor(TFT_WHITE, TFT_BLACK);
if (Novo != "") {
tft.setCursor(Xnovo, Ynovo);
tft.print(Novo);
}
}

basicamente, ela pega uma variável antiga, escreve em preto (com fundo preto), e depois escreve a variável nova com cor branca (com fundo preto). Em meus testes, a transição é muito mais suave do que selecionar uma área e definir com a cor de fundo (isso deixa a letra piscando)

Então, se eu tiver um texto qualquer e for atualiza-lo, não irá ocorrer a sobreposição com letras brancas. Evidentemente, isso gera um leve problema quando for imprimir variáveis numéricas (bool, byte, int, long, float, etc..), pois dará erro na compilação devido a divergência do tipo de variável.

"conversion from 'int' to 'String' is ambiguous"

Para solucionar, basta adicionar, durante a chamada, a função: "String()". Exemplo:

imprimir(String(variavel_numerica_old), Xold, Yold, String(variavel_numerica_nova), Xnovo, Ynovo).

Funciona bem, mas a ideia de ter que SEMPRE adicionar este "String()" me incomoda, soa amador d+, e não estou conseguindo pensar em uma forma simples e compacta de produzir isto. 

Cheguei a adicionar mais dois parametros, para os numéricos, mas achei uma gambiarra.

Pensei também em criar uma segunda função, somente para var. numéricas, mas soa como uma "estratégia por desconhecimento". 

Algum colega teria alguma ideia?

obs- caso não tenha ficado claro, por favor, me avisem, que tento reformular minha postagem.

Exibições: 70

Responder esta

Respostas a este tópico

olá Tiago.

      Basicamente, existem duas formas de se resolver isso:

      1)  a mais simples,  é definir um "template" para uma função.  Explicando:  quando vc define um "template",  vc especifica um tipo genérico de variável, e quando vc compila, o Compilador C++  se encarrega de usar o tipo adequado quando vc usa a variável dentro da função.  Vou mostrar um exemplo simples,  que inclusive é usado nas Bibliotecas Gráficas  como Adafruit  e outras.  Por exemplo uma função tipo "swap",  que troca os valores entre duas variáveis do mesmo tipo, conforme mostrado na figura a seguir:

(clique na figura para "zoom")

      Não se assuste nem se preocupe com o "&" que está após a palavra "Tipo".  Neste exemplo, a funcionalidade da troca de variáveis exige que se use o "&" (poderia também usar Ponteiros, mas as pessoas torcem o nariz para isso, e o "&" é bem mais deglutível).  Mas na função que vc quer implementar isso pode não ser necessário, se as variáveis originais não forem alteradas dentro da função.

      2)  a segunda maneira, é usar "overloads".  Vc pode usar "overloads" mesmo fora de Classes  e fora de Bibliotecas.  Essa forma dá mais trabalho, mas não é muito, pois geralmente vc acaba usando "copiar e colar" pra implementar mais rápido.  Um "overload" é uma função com exatamente o mesmo nome e funcionalidade de uma outra  e que retorna o mesmo tipo,  mas os parâmetros da função  são diferentes em cada "overload".  Não darei exemplos aqui, pois há muitas variações neste tipo de implementação, e acredito que acabaria confundindo (além de ficar incompleta a abordagem).  Mas se vc pesquisar sobre "overloads" em C++,  encontrará bons exemplos de implementação.

      No entanto, independente dos dois métodos que enunciei,  a forma como vc está implementando, passando valores "antigos" e "novos",  eu considero um problema.  Ou seja,  em minha opinião (e provavelmente de experts),  vc precisa mudar essa abordagem,  pois ela não parece ter futuro.

      Como estou em contato com vc pelo Skype,  por lá te darei mais detalhes, e depois vc pode voltar aqui e complementar o tópico da forma que vc achar mais conveniente.

      abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço