so_simple Posted May 31, 2006 at 05:24 PM Report Share #30359 Posted May 31, 2006 at 05:24 PM 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 More sharing options...
Warrior Posted May 31, 2006 at 06:34 PM Report Share #30367 Posted May 31, 2006 at 06:34 PM 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 More sharing options...
TheDark Posted June 1, 2006 at 12:17 AM Report Share #30506 Posted June 1, 2006 at 12:17 AM 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 More sharing options...
so_simple Posted June 1, 2006 at 08:18 AM Author Report Share #30528 Posted June 1, 2006 at 08:18 AM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now