Jump to content

array de struct para funcoes


so_simple
 Share

Recommended Posts

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);
}
Link to comment
Share on other 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)

Link to comment
Share on other 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... 😄

Desaparecido.

Link to comment
Share on other 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!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.