• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sota

Passagem de apontadores

5 mensagens neste tópico

void Le_fich(struct PLANO *Plan){
FILE *file;
int i,j=0,exit=0, n_estacoes,n_pecas,estacao;
char modo;
struct PLANO *Planos;
Planos =(PLANO*) calloc(1, sizeof(struct PLANO));
file=fopen("planotrabalho.txt","r");
while(exit==0){
	j++;
	if (fscanf(file,"%d %d ",&n_estacoes, &n_pecas)!=EOF){
		printf("Plano: %d---------------------------------------\n",j);
	//	printf("Numero de estacoes: %d\nnumero de pecas: %d\n",n_estacoes,n_pecas);

	Planos =(PLANO*) realloc(Planos, j);
	(Planos+(j-1))->n_estacoes=n_estacoes;
	(Planos+(j-1))->n_pecas=n_pecas;
	(Planos+(j-1))->estacoes= (int *) calloc(n_estacoes+1,sizeof(int));
	(Planos+(j-1))->modo= (char *) calloc(n_estacoes+1,sizeof(char));
	printf("Numero de estacoes: %d\nnumero de pecas: %d\n",(Planos+(j-1))->n_estacoes,(Planos+(j-1))->n_pecas);
	}
	else
		exit=1;
	for (i=0;i<n_estacoes;i++){
		if(fscanf(file,"%d %c ", &estacao, &modo)!=EOF){
			//printf("Estacao numero %d  modo %c\n",estacao,modo);
			(Planos+(j-1))->estacoes[i]=estacao;
			(Planos+(j-1))->modo[i]=modo ;
			printf("Estacao numero %d  modo %c\n",(Planos+(j-1))->estacoes[i],(Planos+(j-1))->modo[i]);
		}
		else
			exit=1;
	}
};
Plan = Planos;
fclose(file);
}

Noutro .c faço:

void EscolherPlano(){
struct PLANO *Plano;
int c;
Le_fich(Plano);
printf("Escolha o numero do plano:\n");
scanf("%d",&c);
printf("numero de estacoes: %d \n",(Plano+(c-1))->n_estacoes);

}

Tou a fazer bem?? é que o programa arrebenta no printf final :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolvi com um return. Mas não e suposto fucionar a mesma?? ou é so em linux??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se rebentava num printf há algo que n deve estar resolvido por causa de um return... penso eu de que...

Corre o valgrind e vê o q t diz...

Já agora isso tá um bocado confuso, e essa notação ponteiriça tb n ajuda muito... podias sempre escrever

Planos[j-1].n_estacoes=n_estacoes;

em vez de

(Planos+(j-1))->n_estacoes=n_estacoes;

e também acho q n é muito feliz andar em todo o lado com j-1, quando podes incrementar o j no final do ciclo while ou começar em 1 em vez de 0...

mas se funciona siga q é quase natal

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esses estouros nos printfs com apontadores, normalmente, quer dizer que o endereço de memória que estás a buscar está a NULL ou não tens permissões para lá aceder.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que percebi os estouros era porque quando ia fazer o printf não tinha conseguido passar o valor da variavel. assim que fiz o return funcionou tudo as mil maravilhas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora