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

so_simple

array de struct para funcoes

4 mensagens neste tópico

Tenho uma funcao que le um ficheiro binario para um array de structs! Como é que faço a passagem desse array para o main?

int consultar(struct movimento *d)
{
FILE *f;
int cont=0,i;
  f=fopen("conta","r");
  if (!f)  printf("ERRO");
  d=(struct movimento*)malloc(sizeof(struct movimento));
  fread(&d[cont],sizeof(struct movimento),1,f);         
  while(!feof(f)){
                  cont++;
                  realloc(d,cont*sizeof(struct movimento)); 
                  fread(&d[cont],sizeof(struct movimento),1,f);                        
    }
    fclose(f);
    return(cont);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

faz return da struct/array na função ou declara a struct/array para onde les global em vez de local

Edit: li agora o teu código

declara o cont global e retorna antes o d (não te esqueças de mudar o tipo à função e à variável que recebe os dados)

Assim tens acesso a ambos no main. Por acaso um dos problemas do C é que não podemos fazer return a mais do que uma coisa em cada função. (neste caso dava-te jeito o cont e o array)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O teu código está quase perfeito em termos do que pedes. Não sei se o resto está bem, embora à primeira vista pareça estar tudo a funcionar. A solução encontra-se em retornar o apontador para a struct e receber como parâmetro um apontador para int. Isto implica uma pequena alteração ao código, mas nada de muito complicado.

A alteração principal será no cabeçalho da função, que passará a ser

struct movimento *consultar(int *r)

e tens que acrescentar a declaração de uma

	struct movimento *d;

No final da função, em vez de

	return(cont);

terás

	*r=cont;
return d;

Depois destas alterações, o código usado para chamar a função será algo do género:

struct movimento *pmov;
int n_elementos;
(...)
pmov=consultar(&n_elementos);

Não esquecer o &. A partir daqui já tens acesso na main à estrutura que criaste dentro da função. No exemplo que apresentei, a estrutura encontra-se apontada por pmov após a chamada à função. E ficas com o número de structs criadas na variável n_elementos.

declara o cont global

Embora seja possível, isto é má prática. Imagina que chamas a função duas vezes seguidas. Tens que chamar a função, copiar o valor da variável global, chamar de novo a função, e guardar de novo a variável global. Para não falar que vais ter o espaço utilizado pela variável alocado durante toda a execução do programa. Embora não seja grave neste caso, o hábito faz o monge, e maus hábitos são dificeis de abandonar.

Por acaso um dos problemas do C é que não podemos fazer return a mais do que uma coisa em cada função. (neste caso dava-te jeito o cont e o array)

O código que mostrei faz "retorno" de 2 valores, embora só exista um retorno verdadeiro. Saber como funciona a passagem de variáveis e o funcionamento do stack ajuda a ter uma ideia de como tudo isto se processa. Ao fazermos *r=cont; estamos a colocar no endereço apontado por r o valor de cont. Ao fazermos return d; estamos a colocar no stack (ou num registo, dependendo da arquitectura) o endereço do array criado, ou o endereço do 1º elemento do array, se preferirem. Posteriormente este será copiado para a variável que dissémos que queríamos afectar (no exemplo, pmov).

Isto dava pano pra mangas... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Warrior em C não dá para fazer retorno de array... por isso usa-se um array na entrada para depois preenche-lo e ficar no main!

The dark thanks for the help... vou testar e dps digo qq coisa!

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