Erros funcao eval

Erros funcao eval

por Lucas Silva -
Número de respostas: 10

Estou utilizando uma interface para guardar os valores da pilha de execucao, para isso eu tenho uma estrutura Stack que aponta para a cabeça da pilha. Porém, ao fazer aux = stackPop(s) (onde stackPop retorna um float) e aux é um float, recebo o seguinte erro: incompatible types when assigning to type ‘float’ from type ‘struct CelUtil *’

E, ao fazer a referenciação, s->topo->bla, recebo este erro:

dereferencing pointer to incomplete type

 

Não entendi esses erros, dado que s e uma estrutura que aponta para algo e eu estou realizando a atribuição de um valor float.

 

Em resposta à Lucas Silva

Re: Erros funcao eval

por Gabriel Ogawa -

Dá uma olhada se o typedef está certinho e depois ou junto da declaração da struct, ter um typedef com um erro de digitação, ou não ter o typedef, ou ter o typedef antes de declarar a struct é o que geralmente causa o segundo erro (eu acho).

Se tiver tudo que nem a implementação do professor (http://www.ime.usp.br/~coelho/mac0122-2013/aulas/aula13-programas/stack3/stack.c) deveria funcionar.

Em resposta à Gabriel Ogawa

Re: Erros funcao eval

por Lucas Silva -

O primeiro erro eu já consegui arrumar, eu não tinha modificado o protótipo da minha função na stack.h, mas o segundo erro ainda aparece. Não sei se resolveria o problema se eu alocar uma célula e fazer algo do tipo s->topo = celula ou se dá certo mesmo se eu simplesmente alocar o s->topo como uma celula e passar a usa-lo, que é o que estou fazendo atualmente.

Em resposta à Lucas Silva

Re: Erros funcao eval

por Lucas Silva -

Tentei alocar uma célula na minha eval e fazer s->topo apontar para ela e depois setar o campo prox dela como NULL, mas acabei encontrando o mesmo erro. Porém,quando eu fiz uma versão do meu EP onde eu não utilizava a interface e fazia todas funções da stack.c no próprio programa, o erro sumiu. Mas isso é meio estranho, dado que eu fiz as mesmas modificações que eu fiz nas funções numa versão na outra.

Parece que a implementação com interface, por algum motivo que eu desconheço, não reconhece s->topo apesar de essa estrutura já ter sido alocada.

Em resposta à Lucas Silva

Re: Erros funcao eval

por José Coelho de Pina -

Lucas,

  1. Qual das implementações de pilha você esta usando?
    É aquela que o Gabriel mencionou? Aquela que para usar tem que declarar "Stack s;"
  2. A sua pilha é uma pilha de que é uma pilha de ponteiros para CelUtil (CelUtil*), certo?
  3. Você poderia copiar aqui a mensagem junto com a expressão que você estava testando.
    Você deve estar testando o programa no modo interativo antes de partir para o script, certo?
Em resposta à José Coelho de Pina

Re: Erros funcao eval

por Lucas Silva -

1. Sim, é a que o Gabriel mencionou.

2 Sim, e, ao incilizá-la, eu primeiro aloquei o espaço para s e depois espaço para o ponteiro do inicio da lista.

A principio eu fazia algo do tipo s->topo = malloc(sizeof(CelUtil))

Mas nem na versão onde as funções de manipulação de pilha estavam no programa eval.c essa implementação estava funcionando. Depois eu passei a alocar o espaço para o s, depois alocava uma celutil e fazia o topo apontar para ela. Com isso, deixei de ter o erro na versão onde tudo estava no eval.c, porém na versão com interfaces, o problema persistiu.

3. A mensagem aparece nessa linha:

s->topo = h;

dereferencing pointer to incomplete type

Esse erro aparece em qualquer outra linha da minha eval.c onde eu tento fazer alguma coisa com s->topo.

Nesse caso acima, h é uma CelUtil que eu aloquei na minha função eval para funcionar como a cabeça da lista, fiz isso para ver se o problema era quando eu alocava a célula dentro da interface, mas pelo visto é outra coisa.

 

Quanto ao que o senhor comentou posteriormente, eu modifiquei depois todas as funções e agora estou trabalhando com uma lista com cabeça.

Em resposta à Lucas Silva

Re: Erros funcao eval

por José Coelho de Pina -

Oi Lucas,

Você olhou aqui o que comentei sobre os ******* no arquivo stack.c?
Na copia do seu EP3 que você me mostrou na quarta-feira eu havia colocado essas estrelas para te alertar sobre um ponto da implementação. Elas deveriam ser removidas.

1. Sim, é a que o Gabriel mencionou.

Ok

3. A mensagem aparece nessa linha: s->topo = h; dereferencing pointer to incomplete type Esse erro aparece em qualquer outra linha da minha eval.c onde eu tento fazer alguma coisa com s->topo.

Tem algo que eu não estou entendo.
Se você está usando a implementação que o Gabriel mencionou, então o seu programa não deveria ter s->topo... na função eval(). A sua eval() só deveria utilizar a pilha através da interface dada por stack.h:

   Stack s = stackInit...;

   stackPush(s,bla);
   stackPop(s);
   stackTop(s);

Bem, de qualquer maneira, isto não explica o erro de compilação.

Nesse caso acima, h é uma CelUtil que eu aloquei na minha função eval para funcionar como a cabeça da lista, fiz isso para ver se o problema era quando eu alocava a célula dentro da interface, mas pelo visto é outra coisa.

Bem, se h é do tipo CelUtil então você deveria fazer

   CelUtil h;

   p->topo = &h; /* p->topo eh um ponteiro para um CelUtil */
                 /* portanto deve receber um endereço de um CelUtil */

Mas isto também não explica o erro de compilação com dereferencing...

Em resposta à José Coelho de Pina

Re: Erros funcao eval

por Lucas Silva -

É, eu também não entendi o erro de dereferencing, parece que a eval não reconhece a s->topo de jeito nenhum.

Quanto a parte de manipular a pilha somente através de funções, será que seria melhor se eu fizer algo do tipo setTop(s, bla) so pra mudar o valor do topo da fila? Dado que era isso que eu estava tentando fazer na própria eval.

Em resposta à Lucas Silva

Re: Erros funcao eval

por José Coelho de Pina -

será que seria melhor se eu fizer algo do tipo setTop(s, bla) so pra mudar o valor do topo da fila?

Para alterar o topo da pilha você pode usar as função do stack.c:

  topoAntigo = stackPop(s);
  stackPush(s,topoNovo);
Em resposta à José Coelho de Pina

Re: Erros funcao eval

por Lucas Silva -

Verdade, não tinha pensado nisso, daí acabei fazendo uma função só pra setar o topo, vou usar as funções que já estavam na stack.c