Falha de Segmentação....(Resolvido)

Iniciado por lacerdabh, 29 de Junho de 2007, 23:17

tópico anterior - próximo tópico

lacerdabh

O seguinte trecho  do meu codigo esta dando este erro..

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?
bemColar | Adesivos de Parede

Darcamo

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.

daskrs

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

lacerdabh

Já consegui resolver o problema, obrigado.
bemColar | Adesivos de Parede

Darcamo

Você poderia dizer qual foi a solução e colocar "Resolvido" no título?
Isso iria ajudar outros com problemas semelhantes ao seu.

lacerdabh

Citação de: Darcamo 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.

tinham dois problemas

O primeiro no codigo
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.
bemColar | Adesivos de Parede

Darcamo

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.

daskrs

#7
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?

Darcamo

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.

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
void somador(Dados *reg, int k,int i){ ... }
ou criar uma nova variável a partir dessa struct com
Dados dados;
de forma semelhante ao que se tem em C++.

daskrs

Citação de: Darcamo 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.

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
void somador(Dados *reg, int k,int i){ ... }
ou criar uma nova variável a partir dessa struct com
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!?

lacerdabh

Citação de: daskrs online 05 de Julho de 2007, 07:51
Citação de: Darcamo 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.

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
void somador(Dados *reg, int k,int i){ ... }
ou criar uma nova variável a partir dessa struct com
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?
bemColar | Adesivos de Parede

Darcamo

Também não entendi.

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