Autor Tópico: Falha de Segmentação....(Resolvido)  (Lida 7337 vezes)

Offline lacerdabh

  • Usuário Ubuntu
  • *
  • Mensagens: 40
    • Ver perfil
    • Adesivos de Parede
Falha de Segmentação....(Resolvido)
« Online: 29 de Junho de 2007, 23:17 »
O seguinte trecho  do meu codigo esta dando este erro..

Código: [Selecionar]
void somador(struct dados *reg, int k,int i){
if(reg[k].ap[i]=1){
reg[k].ap[i+1]=0;
somador(reg,k-1,i);
}
else reg[k].ap[i+1]=1;

};

void cria_tabela(struct dados *reg, int t1, int t2){
int i,k;
for(k=t1;k>=0;k--)
for(i=1;i<t2;i++) somador(reg,k,i);

};

Qual  seria o erro?
« Última modificação: 03 de Julho de 2007, 01:14 por lacerdabh »

Darcamo

  • Visitante
Re: Falha de Segmentação....
« Resposta #1 Online: 29 de Junho de 2007, 23:34 »
Falha de segmentação não é erro de sintaxe. É erro de execução.
Não adianta postar o código de apenas duas funções e achar que alguém poderá lhe indicar onde exatamente está o erro porque isso é praticamente impossível.

Falha de segmentação ocorre normalmente quando você tenta acessar uma posição de memória que não pode. Ou seja, tenta acessar uma posição fora do vetor, tenta deletar um ponteiro que já foi deletado, etc.

Roda o programa com o debugger que após ele dar o erro o debugger lhe indicará a linha. Aí você pode rastrear o problema.

Offline daskrs

  • Usuário Ubuntu
  • *
  • Mensagens: 84
    • Ver perfil
Re: Falha de Segmentação....
« Resposta #2 Online: 30 de Junho de 2007, 01:00 »
Tente mudar as linhas que tem esse comando " struct dados *reg, " para "dados *reg", caso não funcione poste o código do teu main e do teu
struct dados { };

Offline lacerdabh

  • Usuário Ubuntu
  • *
  • Mensagens: 40
    • Ver perfil
    • Adesivos de Parede
Re: Falha de Segmentação....
« Resposta #3 Online: 02 de Julho de 2007, 10:05 »
Já consegui resolver o problema, obrigado.

Darcamo

  • Visitante
Re: Falha de Segmentação....
« Resposta #4 Online: 02 de Julho de 2007, 21:38 »
Você poderia dizer qual foi a solução e colocar "Resolvido" no título?
Isso iria ajudar outros com problemas semelhantes ao seu.

Offline lacerdabh

  • Usuário Ubuntu
  • *
  • Mensagens: 40
    • Ver perfil
    • Adesivos de Parede
Re: Falha de Segmentação....
« Resposta #5 Online: 03 de Julho de 2007, 01:18 »
Você poderia dizer qual foi a solução e colocar "Resolvido" no título?
Isso iria ajudar outros com problemas semelhantes ao seu.

tinham dois problemas

O primeiro no codigo
Código: [Selecionar]
void somador(struct dados *reg, int k,int i){
if(reg[k].ap[i]"""""=""""1){//Estava atribuindo
reg[k].ap[i+1]=0;
somador(reg,k-1,i);
}
else reg[k].ap[i+1]=1;

};

void cria_tabela(struct dados *reg, int t1, int t2){
int i,k;
for(k=t1;k>=0;k--)
for(i=1;i<t2;i++) somador(reg,k,i);

segundo, não estava passando as variaveis corretas, tirarando isso o codigo funciona corretamente.

O que ele faz?
Gera uma contagem binária
Ex: para numeros de 3 bits.
000
001
010
011
100
101
110
111

faz parte de um programa pra simplificação de equações booleanas.

Darcamo

  • Visitante
Re: Falha de Segmentação....(Resolvido)
« Resposta #6 Online: 03 de Julho de 2007, 20:53 »
Se eu colocar uma atribuição dentro do teste em um if, while e afins o compilador avisa.
Se no seu caso ele não avisa talvez esteja configurado para não exibir warnings, mas acho que eles são úteis.

Offline daskrs

  • Usuário Ubuntu
  • *
  • Mensagens: 84
    • Ver perfil
Re: Falha de Segmentação....(Resolvido)
« Resposta #7 Online: 03 de Julho de 2007, 21:15 »
bha.. verdade.. atribuir no if é muito chato =/
nem notei esse erro, passei batido pelo sinal de igual  ::)

Haa eu comentei do struct pq eu desconheço o uso dele em métodos de atribuição de variável.
tipo o "void somador(struct dados *reg, int k,int i)"
até onde eu sei o struct apenas indica que o bloco de comando é uma estrutura, nunca tinha visto alguém usar como vc usou.

normalmente eu utilizo ele assim:

struct dados
{
      int idade;
      char *nome;
};

dados *reg = new dados();

qual a função exata dele dentro do teu método?
c tem como me explicar +/- como isso funciona dentro do teu código?
« Última modificação: 03 de Julho de 2007, 21:25 por daskrs »

Darcamo

  • Visitante
Re: Falha de Segmentação....(Resolvido)
« Resposta #8 Online: 04 de Julho de 2007, 22:05 »
Acontece que isso é C e não C++. Então o "suporte para criação de novos tipos" é limitado.

Programo mais em C++ e não em C e por isso uso pouco struct (classes são bem mais poderosas que structs) mas vi uma vez uma maneira mais interessante de se usar struct.

Código: [Selecionar]
typedef struct {
Tudo que vai dentro da sau struct
} Dados;

Isso efetivamente cria um novo "tipo" chamado "Dados" (acho melhor "Dados" do que "dados" para enfatizar que é um tipo e não uma variável).

Com isso você deve poder escrever
Código: [Selecionar]
void somador(Dados *reg, int k,int i){ ... }ou criar uma nova variável a partir dessa struct com
Código: [Selecionar]
Dados dados;de forma semelhante ao que se tem em C++.

Offline daskrs

  • Usuário Ubuntu
  • *
  • Mensagens: 84
    • Ver perfil
Re: Falha de Segmentação....(Resolvido)
« Resposta #9 Online: 05 de Julho de 2007, 07:51 »
Acontece que isso é C e não C++. Então o "suporte para criação de novos tipos" é limitado.

Programo mais em C++ e não em C e por isso uso pouco struct (classes são bem mais poderosas que structs) mas vi uma vez uma maneira mais interessante de se usar struct.

Código: [Selecionar]
typedef struct {
Tudo que vai dentro da sau struct
} Dados;

Isso efetivamente cria um novo "tipo" chamado "Dados" (acho melhor "Dados" do que "dados" para enfatizar que é um tipo e não uma variável).

Com isso você deve poder escrever
Código: [Selecionar]
void somador(Dados *reg, int k,int i){ ... }ou criar uma nova variável a partir dessa struct com
Código: [Selecionar]
Dados dados;de forma semelhante ao que se tem em C++.
bom, isso tudo que tu falou eu já sabia faz temo.
agora. nessa linha de código.
void somador(struct dados *reg, int k,int i)
como que o struct dados se comporta quando é informado como parâmetro do void!?

Offline lacerdabh

  • Usuário Ubuntu
  • *
  • Mensagens: 40
    • Ver perfil
    • Adesivos de Parede
Re: Falha de Segmentação....(Resolvido)
« Resposta #10 Online: 06 de Julho de 2007, 13:21 »
Acontece que isso é C e não C++. Então o "suporte para criação de novos tipos" é limitado.

Programo mais em C++ e não em C e por isso uso pouco struct (classes são bem mais poderosas que structs) mas vi uma vez uma maneira mais interessante de se usar struct.

Código: [Selecionar]
typedef struct {
Tudo que vai dentro da sau struct
} Dados;

Isso efetivamente cria um novo "tipo" chamado "Dados" (acho melhor "Dados" do que "dados" para enfatizar que é um tipo e não uma variável).

Com isso você deve poder escrever
Código: [Selecionar]
void somador(Dados *reg, int k,int i){ ... }ou criar uma nova variável a partir dessa struct com
Código: [Selecionar]
Dados dados;de forma semelhante ao que se tem em C++.
bom, isso tudo que tu falou eu já sabia faz temo.
agora. nessa linha de código.
void somador(struct dados *reg, int k,int i)
como que o struct dados se comporta quando é informado como parâmetro do void!?

não entendi a sua pergunta?

Darcamo

  • Visitante
Re: Falha de Segmentação....(Resolvido)
« Resposta #11 Online: 06 de Julho de 2007, 22:05 »
Também não entendi.

O que você quis dizer com "parâmetro do void"?