Ir ao conteúdo
  • Cadastre-se
Maicon Dall Agnol

RESOLVIDO Resolvido problema em passagem de ponteiros

Recommended Posts

Estou fazendo um trabalho em C e eventualmente o programa crasha sem motivo aparente, já cheguei até perguntar pra professora do curso que também não soube o que estava acontecendo  então fiz um protótipo de como estou fazendo que também esta apresentando o mesmo erro :

#include <stdio.h>
#include <conio.h>
struct Teste
{
     char nome[100];
};
typedef struct Teste teste[100];

void fun_teste(teste *testando,int *tam);

void fun_mostra(teste *teste_mostrando,int *tam);

int main ()
{
     teste teste_main;
     int tam=0;
 
     fun_teste(&teste_main,&tam);
}

void fun_teste(teste *testando,int *tam)
{
     do
     { 
             fflush(stdin);
             printf("Complete com um nome: ");
             gets(testando[*tam]->nome); 
             (*tam) = (*tam) + 1;
     }while(*tam<5);
 
      fun_mostra(&(*testando),&(*tam));
}

void fun_mostra(teste *teste_mostrando,int *tam)
{
    int i;
 
    for(i=0;i<*tam;i++)
    {
     puts(teste_mostrando[*tam]->nome);
    }
 
    getch();
}

 

Fiz uma struct que é chamada em vetor e passado para o main, que é passada para o fun_teste, ele compila certinho mas quando executo ele, ele salva a primeira e segunda vez mas na terceira ele trava;

 

Se alguém puder me ajudar, podem editar como for melhor para passar o vetor ou como melhorar essas passagem, fiquem a vontade!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara sempre que for fazer um código em c ou c++ deixa o main sempre como a ultima função, assim fica mais fácil pra entender.

 

O que você pode fazer pra verificar como o *tam ta incrementando e mandar printar ele antes e depois do incremento, talvez seja algum erro ali, to meio enferrujado em c++, mas em fim se ele sai do loop antes das 5 vezes é possível que o erro seja ali.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é um protótipo do meu programa que na realidade é bem maior, e nele eu testei o contador e ele esta normal, o problema é bem estranho mesmo porque cheguei a testar ele em varias maquinas diferentes e cada hora travava em um lugar. Eu cheguei a resolver o problema dele declarando o typedef struct Teste teste[100]; apenas como typedef struct Teste teste; e declarando o vetor dentro do main, mas não consegui passar ele por referencia. É um trabalho de faculdade que já esta 70% pronto, só falta essa parte de preencher certinho o vetor.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
2 horas atrás, Maicon Dall Agnol disse:

já cheguei até perguntar pra professora do curso que também não soube o que estava acontecendo

 

 

tam é um parâmetro em forma de ponteiro, você passou um ponteiro nulo no main.

 

*Editado* Quando você coloca um ponteiro nulo em uma função, ele começa a absorver valores do lixo de memória. Isso faz com que o computador trave ou uma função faça alguma coisa que não faça o que foi programada para fazer. Também vale ressaltar que não se deve dereferenciar um ponteiro nulo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

fun_teste leva um ponteiro como parâmetro.

 

na função main, você declarou uma variável tam como sendo uma variável inteira comum. Quando a função fun_teste for executada, ela vai pegar o endereço dessa variável int que você declarou no main. E como ela está zerada, vai tratar como um ponteiro nulo.

adicionado 2 minutos depois
int main ()
{
     teste teste_main;
     int tam=50; // Aqui pode ser alterado sem problema algum, só coloquei 50 como exemplo.
 
     fun_teste(&teste_main, tam);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <conio.h>
struct Teste
{
     char nome[100];
};
typedef struct Teste teste[100];

void fun_teste(teste testando,int *tam);

void fun_mostra(teste teste_mostrando,int *tam);

int main ()
{
    teste teste_main;
    int tam=0;

        fun_teste(&teste_main,&tam);

}

void fun_teste(teste testando,int *tam)
{
    do{
             fflush(stdin);
             printf("Complete com um nome: ");
             gets((testando+*tam)->nome);
             (*tam) = (*tam) + 1;
    }while(*tam<5);
    fun_mostra(testando,tam);
}

void fun_mostra(teste teste_mostrando,int *tam)
{
    int i;
    for(i=0;i<*tam;i++)
     puts((teste_mostrando+i)->nome);
}

observe que teste já é um ponteiro. Desculpa se estiver falando besteira, mas eu realmente nunca vi dar typedef como vetor. Mas o importante é que assim funciona. Agora, vocÊ poderia fazer assim também

 

Citação

void fun_teste(struct Teste *testando, int *tam);

Isso porque a variavel teste_main é do tipo teste, que é um ponteiro do tipo Teste

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acabei resolvendo graças ao MassakiMsk que mostrou esse outro jeito de receber conteúdo na struct : gets((testando+*tam)->nome); , só uma coisa que mudei foi que passei por referencia ficando assim : gets((*testando+*tam)->nome); pois do outro jeito não compilava. Problema resolvido então, muito obrigado a todos que se dispuseram a ajudar!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×