utikawa
(usa Ubuntu)
Enviado em 29/12/2007 - 01:23h
Na verdade você deu "sorte" de não dar erro antes... :-)
Como você mesmo disse, o problema acontece depois de compilado. Portanto não é erro de sintaxe! Assim o problema é com a lógica em si.
O erro de segmentação indica normalmente que houve acesso a uma região de memória que você não estava autorizado. Portanto o erro indica que seria problema com vetores sendo acessados após o seu limite.
Quanto ao erro que está acontecendo, o motivo é que existem três grandes problemas com o código! Vou comentar as linhas associadas e explicar o que está acontecendo no final:
#include <stdio.h>
struct casa{
char cor[20]; // Criada estrutura com apenas um elemento: vetor com 20 posições
}
// Função que recebe um ponteiro para elemento da estrutura criada, ou seja, endereço na memória onde está este elemento.
cadastro(struct casa *cad){
int x=0;
printf("Cor: %s\n",x); // Primeiro problema!
scanf("%s", &cad[x].cor); // Segundo problema!
printf("\n");
}
int main(){
struct casa enter[0]; // Terceiro problema!
cadastro(enter); // Passagem do ponteiro para função
printf("\n\n\nFim\n\n\n");
}
Primeiro vou falar do terceiro problema:
O que esta linha está fazendo? Como criamos um vetor?
Para declarar um vetor devemos colocar entre os colchetes o número de elementos que o vetor será capaz de armazenar. No seu caso você colocou zero! Ou seja: este é um vetor que não tem capacidade para armazenar nada! Eu mesmo não sabia que o compilador não dava erro por isso... :-)
O correto seria colocar um numero como, por exemplo, 5. Assim este vetor poderia armazenar 5 elementos da estrutura definida, sendo então estes elementos acessados pelos índices entre 0 e 4 pois em C/C++ os índices sempre começam em zero.
Portanto, apenas reforçando: ao criar o vetor devemos colocar o número de elementos e para acessá-lo devemos utilizar os índices entre zero e número de elementos - 1.
O primeiro problema é devido a tipos incompatíveis de variáveis. Nesta linha você está executando o printf que deveria receber como argumentos a string com o formato e as variáveis que serão exibidas. Neste caso o formato indica que será exibida uma string porém a variável é do tipo inteiro. A linha correta é:
printf("Cor: %d\n", x);
Outra coisa é que esta variável x será sempre o mesmo valor pois ela é criada, inicializada com zero e já é exibida. Pelo código o correto seria:
static int x=0;
Antes de sair da função deveria ser incrementado o valor de x.
O segundo problema é com o parâmetro sendo passado para o scanf.
Apenas para esclarecer: a função scanf recebe ao menos 2 argumentos: a string de formato e o endereço onde o dado digitado pelo usuário será salvo. Assim o segundo argumento deveria ser o endereço da variável cor da estrutura. Agora vamos analisar o que está sendo passado:
&cad[x].cor
& indica que é para ser retornado o endereço da variável a seguir.
cad[x] indica que está sendo acessado o elemento x do vetor cad
.cor indica a variável cor da estrutura. Porém esta variável é na realidade um vetor.
Resumindo: a linha está gerando o endereço do vetor cor no elemento x de cad. Porém, no caso de um vetor, se você passá-lo como parâmetro sem colocar um índice já será retornado o endereço do vetor. Assim o símbolo & indica algo como endereço do endereço do vetor. A linha correta seria:
scanf("%s", cad[x].cor);
Pronto! Só isso... :-)
Agora mais alguns comentários: este cad[x] acessa 20 elementos se você permitir. Deve ser criada alguma lógica que não permita acessar um elemento maior que o definido.
Outra coisa: tem muitos erros neste código, sinceramente me pareceu um exercício como um trabalho de escola. Caso for, está resolvido!
Não avaliei totalmente, podem existir mais coisas. Caso realmente seja um exercício, por favor tente aprender a linguagem. Ela é fantástica e permite que se faça virtualmente tudo que você possa imaginar!!! E se você não aprender nem mesmo a base mais nada será aprendido.
Este é um "segredo" para tudo na vida: quer aprender a fazer bem feito qualquer coisa? Treine bastante e nunca tente aprender mais rápido que o possível! É como construir um prédio: se você não souber construir as colunas e a fundação, nem adianta querer aprender a construir as paredes. Elas nunca ficarão certas, por mais que você tente...