Ir ao conteúdo
  • Cadastre-se

Resolvido problema em passagem de ponteiros


Ir à solução Resolvido por MassakiMsk,

Posts recomendados

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!

Link para o comentário
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
Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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);
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução
#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
Link para o comentário
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!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...