Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda urgente com struct


Guest --Evaldo --

Pergunta

Guest --Evaldo --

Estou tentando atribuir ao struct do tipo ponteiro da função main() um outro struct do tipo ponteiro retornado por uma função, mas não tenho resultados concretos, apenas tenho a exibição de lixo.....

Alguém sabe como solucionar isso??

Ajudem, por favor, preciso urgentemente........

Segue o código:

#include <stdio.h>

#include <stdlib.h>

//Declaração do tipo de estrutura

struct tipo{

int numero;

float x, y;

char varchar1[40], varchar2 [10], varchar3 [12];

};

//Variável Global necessária p/ contagem

int var=1;

struct tipo *leitura();

//Função Principal

main(){

char opcao;

struct tipo *p;

do{

p=leitura();//Atribuindo o struct ponteiro da função p/ o ponteiro p

system("cls");

printf("Numero : %d\n", p->numero);

printf("Valores float : x = %.2f e y = %.2f\n", p->x, p->y);

printf("Varchar1 = %s\n", p->varchar1);

printf("Varchar2 = %s\n", p->varchar2);

printf("Varchar3 = %s\n", p->varchar3);

printf("Deseja Continuar (S/N)?");

scanf("%s", &opcao);

system("cls");

}while(opcao=='S' || opcao=='s');

}

//Função de leitura que retorna um struct do tipo ponteiro

struct tipo *leitura(){

struct tipo le, *pont_le;

le.numero=var;

printf("Informe o valor float x: ");

scanf("%f", &le.x);

printf("Informe o valor float y: ");

scanf("%f", &le.y);

printf("Informe varchar1: ");

scanf("%s", &le.varchar1);

printf("Informe varchar2: ");

scanf("%s", &le.varchar2);

printf("Informe varchar3: ");

scanf("%s", &le.varchar3);

pont_le=&le

var++;

return pont_le;

}

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Na realidade existem alguns problemas. Seguem meus comentários:

1) A função leitura retorna uma variável criada dentro dela mesma, ou seja, esta variável somente existirá enquanto a função leitura estiver sendo executada. Assim, ao acessar esta variável fora da função através do ponteiro você estará acessando uma área da memória que não está mais alocada e que poderá ser sobrescrita por outra parte do programa, corrompendo os dados.

2) A função scanf precisa do endereço da variável onde os dados lidos serão salvos e por isso usamos o operador &. Porém, ao passar um vetor sem o índice como parâmetro, o vetor retorna o próprio endereço da memória. Assim, usar o operador & nesse caso é como se fosse o endereço do endereço da memória, ou seja, um erro! Para usar um vetor no scanf podemos usar um dos modos abaixo:

char vetor[50];
scanf("%s", vetor);
scanf("%s", &vetor[0]);
3) Evite ao máximo criar variáveis globais! Esta não é uma boa prática. O correto neste caso é criar uma variável estática na função leitura. Esta variável não é destruída ao sair da função e assim, quando a função leitura for chamada novamente, a variável conterá o valor que tinha quando a função terminou pela última vez. 4) Como agora a função leitura recebe uma estrutura e não retorna nada, a função main conterá a declaração de uma variável e não de um ponteiro para a estrutura. 5) Ao ler a variável opcao com scanf foi passado o formato de leitura de string ("%s") ao invés de um char ("%c") que é o tipo da variável opcao. 6) A função main não possuía tipo definido, fazendo portanto que ela tivesse o tipo int. Eu explicitamente indiquei o tipo de retorno int e também adicionei um valor de retorno a ela visto que ela não é void! Segue abaixo a função leitura corrigida:
#include <stdio.h>
#include <stdlib.h>

//Declaração do tipo de estrutura
struct tipo {
  int numero;
  float x, y;
  char varchar1[40], varchar2 [10], varchar3 [12];
};

struct tipo *leitura();

//Função Principal
int main() {
  char opcao;
  struct tipo p;

  do{
    leitura(&p);//Atribuindo o struct ponteiro da função p/ o ponteiro p
    system("cls");

    printf("Numero : %d\n", p.numero);
    printf("Valores float : x = %.2f e y = %.2f\n", p.x, p.y);
    printf("Varchar1 = %s\n", p.varchar1);
    printf("Varchar2 = %s\n", p.varchar2);
    printf("Varchar3 = %s\n", p.varchar3);
    printf("Deseja Continuar (S/N)?");

    scanf("%c", &opcao);
    system("cls");
  } while(toupper(opcao)=='S');

  return 0;
}

//Função de leitura que retorna um struct do tipo ponteiro
void leitura(struct tipo *pont_le) {
  static unsigned int var = 1;
  pont_le->numero=var;

  printf("Informe o valor float x: ");
  scanf("%f", &pont_le->x);

  printf("Informe o valor float y: ");
  scanf("%f", &pont_le->y);

  printf("Informe varchar1: ");
  scanf("%s", pont_le->varchar1);

  printf("Informe varchar2: ");
  scanf("%s", pont_le->varchar2);

  printf("Informe varchar3: ");
  scanf("%s", pont_le->varchar3);

  var++;
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...