Pessoal, boa noite.

estou tentando me entender melhor com pointers e operadores de endereço (&),

e encontrei uma situação um pouco difícil para que eu entenda.

O sketch pode ser reduzido a somente 2 linhas dentro o setup().

1a linha:  -- >    int valor = 0x1234; 

2a. linha: -- >    int addr = &valor; 

Ao compilar usando as plataformas Arduino, não tem problema, compila corretamente,

mas ao compilar usando a plataforma ESP8266 tenho o seguinte erro na segunda linha:

 " invalid conversion from 'int*' to 'int' [-fpermissive]  "

Esta é uma operação normal em C e tem até como exemplo em: (foo = &myvar;)

http://www.cplusplus.com/doc/tutorial/pointers/

Alguém já experimentou este problema ou sabe sabe explica-lo?

Agradeço antecipadamente qq ajuda.

RV

Exibições: 108

Responder esta

Respostas a este tópico

Bom dia pessoal,

o que consegui identificar até a gora é o seguinte:

Qdo roda selecionando as plataformas arduino, é usado um arquivo  "platform.txt" que fica na pasta: 

C:\Program Files (x86)\Arduino\hardware\arduino\avr,

e qdo usa a plataforma ESP8266  é usado um arquivo  "platform.txt"'que fica na pasta:  

   C:\Users\meuNote\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.1

No primeiro caso existe uma linha assim:

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions.........................

ela tem o flag -fpermissive,

e no segundo caso existe uma linha assim:

compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions..........................

que não tem este flag.

Daí para teste coloquei este flag no arquivo "platform.txt" da pasta do ESP8266, e compilou corretamente.

Não sei exatamente o que este flag faz e qto pode afetar em outros sketch com ESP8266.

Se alguém souber outra solução para este problema, agradeço antecipadamente a informação.

RV

O erro é apresentado para qual linha? A linha 2, imagino eu?

https://stackoverflow.com/questions/8843818/what-does-the-fpermissi...

Em resumo, significa que na biblioteca do arduino, ele permite esse mudança de tipo e no do ESP8266, não. E a recomendação vc deve saber bem o que está fazendo para adicionar o flag.

Quanto ao problema em si, acho que é o int addr = &valor. Você está definindo que a variável addr é um int, mas na verdade ela é o tipo é uma referencia ao ponteiro.  portanto, fazendo int* = &valor; deve ser o que o correto.

PS: Não sou grande conhecer de C nem de pointeiros.

RT, boa tarde.

obrigado pela sua resposta.

Em C é comum este uso que quero fazer.

Veja em :

http://www.cplusplus.com/doc/tutorial/pointers/

foo = &myvar;

RV

bom, como disse, não sou expert em C/C++, nem em pointers, mas conheço de forma geral, arquitetura de computador, compilador, etc.

a diferença que você mesmo encontrou entre as duas bibliotecas, é a flag que diz para o compilador ignorar ou não a conversão de tipos quando ela é inválida. No arduino a biblioteca permite ignorar e no esp8266 não. Pode até funcionar para a maioria dos casos colocando o flag (ou até todos), precisaria perguntar em algum forum da expressif o por que da biblioteca deles não ignorar.

De qualquer forma, o ponto é que a operação é inválida para o compilador.

Quanto ao link que você passou, e o exemplo que você mencionou, (foo = &myvar;), aqui está apenas acontecendo a atribuição de um valor para uma variável, não está acontecendo a declaração da variável foo.

Mais abaixo, no link que você passou, tem exemplo de código completos, você vê a declaração int* e depois a atribuição de valores.

um exemplo simples com suas variáveis, que testei com gcc e c++ no WSL:

#include <stdio.h>
int valor = 0x1234;
// int addr = &valor;
// int* addr = &valor;
int* addr;

int main()
{
addr = &valor;
printf("Valor %x", valor);
printf("Pointer %p", &valor);
printf("Pointer %p", addr);
return 0;
}
Se você tem linux, mac ou windows 10, ou ainda, usar uma linux virtual, é interessante para facilitar testes com c. ou claro, instalar o compilador puro c no windows tb.

Ok, então pelo que entendi da sua explicação,

eu não posso fazer uma variável receber o valor de um operador de endereço (&),

mas posso fazer um ponteiro receber este valor. Correto?

   int valor;

   int myVar;

   int *myPtr;

    myVar  = &valor;    --  errado.

    myPtr  =  valor;    --  certo.

É assim?

Agora vem a segunda dificuldade  (kkkkk).

Quero fazer um ponteiro apontar para um byte somente da variável.

Daí li que o ponteiro usa a estrutura da memoria do processador,

se ele tem memoria endereçável de 16 bits, o ponteiro é de 16 bits,

se ele tem de 32 bits o ponteiro é de 32 bits. OK?

http://www.cplusplus.com/doc/tutorial/pointers/

......type * name; 

where type is the data type pointed to by the pointer. This type is not the type of the

pointer itself, but the type of the data the pointer points to

.....These are three declarations of pointers. Each one is intended to point to a different data type, but, in fact, all of them are pointers and all of them are likely going to occupy the same amount of space in memory (the size in memory of a pointer depends on the platform where the program runs).

RV

bom, como disse, não sou grande entendedor do assunto.

Mas o conceito é esse que vc descreveu mais ou menos, a "semântica" é que muda.

*pointer = isto é um ponteiro

&pointer = isto é uma referencia ao ponteiro (só tem o endereçamento da memória que o valor está gravado)

int* var = var será do tipo ponteiro. mas é uma variável.

acho que é isso. hehe...

finalizando a resposta, pois não tive que resolver umas coisas aqui e não li seu email até o fim.

Lendo direito sua mensagem. Baseado nestas declarações:

int valor; - digamos a posição de memória 0x601038 foi alocada para esta variável

int myVar;

int *myPtr;

vai depender do que você quer:

myVar = valor; - atribuição de conteudo normal de uma variável para outra;

myPtr = &valor; - atribuição do endereço de memória da variável valor ao ponteiro myPtr;

https://onlinegdb.com/Syl6N99GE

Já a sua segunda pergunta, isso vai muito além do meu conhecimento em C/C++ e de ponteiros, hehe, mas sei que deve ser trabalhar com arrays.

talvez isso ajude https://stackoverflow.com/questions/1860983/convert-integer-to-array

 

Mas em geral, precisa saber o que você pretende fazer para ambos os casos. Qual a necessidade do pointer e por que você precisa trabalhar byte a byte?

Bom dia RT,

novamente obrigado por sua atenção e seu tempo.

Na realidade eu não tenho ainda uma aplicação especifica para este endereçamento

byte a byte.

Como sou um técnico muito antigo de hardware, (desde o tempo das válvulas),

aprendi programar em basic, assembly e C, autodidaticamente, e tenho sempre umas dúvidas "cruéis", e o meu processo de aprendizado é o método "aprenda fazendo",

por isto faço alguns sketchs com modelos reduzidos das operações, simulando os resultados

Na realidade as dúvidas começaram no projeto que estamos fazendo,

(eu e + amigos aqui do LdG) , para montar uma rede Mesh com ESP32 e ESP8266.

Eu comecei a tentar entende mais profundamente ponteiro para poder entender

o operador  seta (-->) muito usado nas bibliotecas da Mesh.

E em determinado momento vou precisar analisar um determinado byte de retorno de 

uma msg.

RV

Ahhh, ok, inicialmente, nenhuma aplicação específica, mas como estudo/ampliação de conhecimento.

Já eu não entendo praticamente nada de elétrica/eletrônica. E programação, já fui programador (COBOL principalmente) à muito tempo atras. Nunca deixei de lado 100%, e sempre tento ler e fazer um código aqui outro ali em várias linguagens. C/C++, só comecei a mexer depois que comecei a brincar com Arduino/ESP8266.

Mas conceitos gerais não mudam (tanto, hehe), então tento estudar mais os fundamentos, conceitos e motivações para aplicações, ai fica mais fácil de entender o por que de usar determinado técnica/ferramenta em cada lugar, e até por isso estou "preso" em avançar qq coisa com Arduino, como meus conhecimentos em elétrica/eletrônica são bem pequenos, estou buscando estudar as bases aos poucos, desde Tales de Mileto, hehe... nada pratico... mas muito legal.

Quanto ao ponto espeçifico de montar rede Mesh, pelo que vi, é um nível muito complexo de conhecimento e em geral não vale a pena fazer do zero. Já existem diversas bibliotecas que fazem isso. Como conhecimento ok, mas para uso mesmo, não acredito que valha a pena, melhor deixar para os programadores feras mesmo.

Sim, sobre a rede mesh não estamos iniciando do zero não,

estamos usando as bibliotecas que encontramos na internet,

principalmente a painlessMesh, mas tem umas rotinas que queremos

incrementar umas soluções "malucas", e daí vem o estudo.

Esta biblioteca é muito boa, e fácil de usar.
RV

Se aceitar/quiser mais um participante no projeto. Estou à disposição.

Não conheço o esp a esse nível mas tenho um palpite...

Por se tratar de um RISC de 16 ou 32 bits o barramento de endereço deve ter mais de 16 bits. Processador de 16 bits já tem tudo exagerado, imagina os de 32....

Então o endereço da posição de memoria onde ele vai guardar o tal valor precisa ser de n bits. Não sei quanto é n, mas parece ser mais de 16 (tamanho do int).

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço