Jump to content
Sign in to follow this  
Seabra

Passar STRUCT para fora da função VOID

Recommended Posts

Seabra

Boas...

Este código vai ler o ficheiro  e imprime corretamente dentro da função. Fora da função imprime uns numerios que não tem nada a ver com o que imprime dentro.

O que é que estará mal aqui?

#include <stdio.h>
#include <string.h>
#include <windows.h>

struct dados
{
    int largura;
    int velocidade;
    char texto[50];
};

void escreve(struct dados  val);
void ler(struct dados val);

int main()
{

   struct dados entdados;
   
  	ler(entdados);
    printf("%s\n",entdados.texto);
    printf("%d\n",entdados.largura);
    printf("%d\n",entdados.velocidade);

    getchar();
    getchar();

    return 0;
}




void ler(struct dados  val)
{

   FILE* fin = fopen("c:\\castanha1.txt", "r");
   fread(&val, sizeof(val), 1, fin);
   fclose(fin);
     printf("%d %s %d\n", val.largura, val.texto, val.velocidade);
   return (void) val;
}

Imprime dentro da função: "500 dados novos 1000" , que é o que está no ficheiro. Fora da função imprime "2686672 2686728" em linha diferentes, o que não corresponde nada ao que está no ficheiro.

Onde é que estará a errata?

Bom Natal!

Share this post


Link to post
Share on other sites
HappyHippyHippo

de uma forma ou outra, a assinatura da função terá de ser alterada.

ou retornas a estrutura, ou o dado de entrada terá de ser um ponteiro para a estrutura.

se a função tem como definido o tipo de retorno void, (nada), logo não faz sentido tanto retornar um valor qualquer.

existe um exemplo muito simples para perceber a diferença entre o é enviado para uma função e o que é usado:

void foo(int b)
{
  b = 20;
}

void main()
{
  int a = 10;

  foo(a);
  printf("%d\n", a); // <- que valor aparece aqui ?

  return 0;
}

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Seabra
void foo(int *b)
{
  *b = 20;
}

void main()
{

  int a = 10;
  foo(&a);
  printf("%d\n", a); // <- que valor aparece aqui ?

  return 0;
}

HappyHippyHippo

Consegui noutro fórum que explicassem  como se fazia. Aliás um fórum que me tem sido sempre muito útil e rápido. Percebi e coloco aqui a solução utilizando ponteiro que indicam a posição de memória onde se encontra a variável na pilha.

Obrigado pela tua ajuda que tem sido sempre muito importante e objetiva!

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

Que forúm espetacular !!!

deve ter explicado pontinho por pontinho o que é um ponteiro, algo que perguntei se sabias o que era, mas como esse maravilhoso fórum sabe que sabes, ainda bem interiorizas-te claramente o que é uma posição de memória assim como o que é a "pilha".

e obrigada, sempre tentei ser objectivo "por demais"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Seabra
21 minutes ago, HappyHippyHippo said:

Que forúm espetacular !!!

deve ter explicado pontinho por pontinho o que é um ponteiro, algo que perguntei se sabias o que era, mas como esse maravilhoso fórum sabe que sabes, ainda bem interiorizas-te claramente o que é uma posição de memória assim como o que é a "pilha".

e obrigada, sempre tentei ser objectivo "por demais"

Claro que não! Eu é que tive que  ler sobre ponteiros, como o meu código foi alterado e ficou a trabalhar, agora tenho a ideia de como utilizar ponteiros.

Certamente, num código tão pequeno como o teu exemplo, teria sido mais útil colocares o teu código e o teu código corrigido. Dessa forma, obviamente que eu teria que ir perceber como funcionam os ponteiros para alterar o meu código que deu origem a este post.

De qualquer modo saliento que as tuas respostas, de uma maneira ou de outra, foram-me sempre úteis aqui neste fórum, não é ironia.

Pelo menos no meu caso sempre gostei de, quando não sei, explorar um  exemplo, sempre foi mais fácil de perceber. Sei que há quem pretende que lhe façam a "papinha" toda, mas eu felizmente não preciso que me façam o código.

 

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.