EP3 - Alocação na função eval

EP3 - Alocação na função eval

por Gabriel Ogawa -
Número de respostas: 11

Olá,

Na definição da função eval há a frase "Esta funcao _nao_ deve alocar celula alguma", mas para a implementação da função há a necessidade de existir uma pilha que deve ser representada através de uma lista ligada com cabeça. 

De onde vem a pilha se eu não posso alocá-la? perplexo

 

Deixa pra lá, eu acho que entendi sorriso

Em resposta à Gabriel Ogawa

Re: EP3 - Alocação na função eval

por Renato de Souza -

Eu ia criar um tópico perguntando isso.
Pensei em usar a própria lista como uma pilha, mas acabaria não tendo como 'voltar' e acessar elementos anteriores.pensativo

Em resposta à Gabriel Ogawa

Re: EP3 - Alocação na função eval

por José Coelho de Pina -

Salve,

Eu reescrevi o comentário da função.
Agora é

/*-------------------------------------------------------------
  eval(iniPosfixa, mostrePilhaExecucao)
   . . .
  Esta funcao _nao_ deve alocar celula alguma, no entanto ela
  deve dar free nas estruturas que deixarem de ser necessarias.

  CORRECAO em 28/SET: 
     Esta funcao, ou qualquer funcao chamada por ela,
     pode alocar __no maximo__ uma celula CelUtil para ser a 
     cabeca da pilha. Isto pode ser particularmente util
     para aqueles que desejarem escrever uma interface e uma
     biblioteca como as stack.h e stack.c feitas na aula
     desta semana.  

Em resposta à José Coelho de Pina

Re: EP3 - Alocação na função eval

por Renato de Souza -

Entendi. Se eu fizer minha interface, devo enviá-la junta aos outros dois arquivos, né?

Outra coisa, se eu fizr uma interface stack.c, como ficaria o arquivo make? tímido

Edit: sem problemas escrever as funções de empilhar/desempilhar dentro da própria eval.c (se é que é possivel)?

Em resposta à Renato de Souza

Re: EP3 - Alocação na função eval

por José Coelho de Pina -

Entendi. Se eu fizer minha interface, devo enviá-la junta aos outros dois arquivos, né?

Certo.

Outra coisa, se eu fizr uma interface stack.c, como ficaria o arquivo make

CC     = gcc
CFLAGS = -Wall -ansi -O2 -pedantic -Wno-unused-result
RM     = rm
#------------------------------------------------

# chama o linker
pitao:  main.o eval.o lexer.o stack.o util.o
	$(CC) main.o eval.o lexer.o stack.o util.o -o pitao -lm

main.o: main.c eval.h lexer.h util.h classes.h  
	$(CC) $(CFLAGS) -c main.c 

eval.o: eval.c eval.h util.h classes.h stack.h
	$(CC) $(CFLAGS) -c eval.c 

lexer.o: lexer.c lexer.h util.h classes.h 
	$(CC) $(CFLAGS) -c lexer.c 

util.o: util.c util.h classes.h
	$(CC) $(CFLAGS) -c util.c 

stack.o: stack.c stack.h util.h 
	$(CC) $(CFLAGS) -c stack.c

Edit: sem problemas escrever as funções de empilhar/desempilhar dentro da própria eval.c (se é que é possivel)?

Sem problemas.

Em resposta à José Coelho de Pina

Re: EP3 - Alocação na função eval

por Rodrigo Alves Souza -

stack.o deve necessariamente vir antes do util.o na primeira instrução do Makefile por ele ser uma dependência do util?

Em resposta à Rodrigo Alves Souza

Re: EP3 - Alocação na função eval

por José Coelho de Pina -

stack.o deve necessariamente vir antes do util.o na primeira instrução do Makefile por ele ser uma dependência do util?

A ordem é irrelevante, isso que é legal.
O Makefile só especifica "quem depende de quem".
O bom é deixar o "principal" ( no caso pitao) como sendo o primeiro para poder digitar apenas "make".

Em resposta à José Coelho de Pina

Re: EP3 - Alocação na função eval

por Rodrigo Alves Souza -

Se eu for usar a implementação de stack das aulas. Ele vem com o item.h que contém a definição de Item (char). Mudei de char pra CelUtil mas não rodou, não teria que fazer uma alteração nesse makefile?

Em resposta à Rodrigo Alves Souza

Re: EP3 - Alocação na função eval

por José Coelho de Pina -

Ele vem com o item.h que contém a definição de Item (char). Mudei de char pra CelUtil mas não rodou, não teria que fazer uma alteração nesse makefile?

Hmmm.
No arquivo stack.h, acrescente a linha

#include "util.h"

Melhor, acho, coloque essa linha no início do item.h.

Em resposta à José Coelho de Pina

Re: EP3 - Alocação na função eval

por Rodrigo Alves Souza -

Estou recebendo esse erro triste

stack.c:21:14: error: static declaration of ‘mallocSafe’ follows non-static declaration
In file included from item.h:1:0,
from stack.c:5:
util.h:103:7: note: previous declaration of ‘mallocSafe’ was here
stack.c: In function ‘stackDump’:
stack.c:99:2: warning: format ‘%c’ expects argument of type ‘int’, but argument 3 has type ‘Item’ [-Wformat]
make: *** [stack.o] Error 1

 

Em resposta à Rodrigo Alves Souza

Re: EP3 - Alocação na função eval

por José Coelho de Pina -

Oi Rodrigo,

util.h:103:7: note: previous declaration of ‘mallocSafe’ was here

A função mallocSafe() já foi definida nos arquivos util.c e stach.c e declarada em util.h.
Na declaração de mallocSafe() em util.h não é usado o especificador static enquanto que em stack.c ele é utilizado.
A função mallocSafe() deveria se removida do arquivo stack.c.
Uma função não pode ter duas definições.

definição = há alocação de memória (protótipo junto com o corpo da função)
declaração = não há alocação de memória (apenas o protótipo da função)

stack.c:99:2: warning: format ‘%c’ expects argument of type ‘int’, but argument 3 has type ‘Item’ [-Wformat]
make: *** [stack.o] Error 1

A função stackDump() precisa ser adaptada para imprimir um CelUtil.
Use a função mostreUtil() para isso.