| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 13:11:37
|
RafaelViana
GUJ Master
Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline
|
Quero alterar um dos atributos de uma struct utilizando ponteiros. Mas ao utilizar o código como está abaixo sou "obrigado" a retornar a struct com ponteiro (Aluno*). Consequentemente todos os outros locais do sistema onde utilizo essa função também precisam ter a variavel com o ponteiro.
Código:
Tem como eu receber um parametro por referencia e retornar a struct sem o ponteiro?
|
Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 14:02:28
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Isso é C ou C++? Em C++ não se abusa de ponteiros. Usa-se referências (&) mesmo, mas quero saber o que você quer fazer.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 14:44:38
|
RafaelViana
GUJ Master
Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline
|
C. É um programa tipo CRUD (para faculdade).
Como preciso fazer inclusão e alteração. Para não repetir a leitura da informação centralizo isso em uma função.
Exemplo:
ou entao:
É uma funcao que serve apenas para fazer a leitura de um dos atributos da estrutura.
Pensei que ponteiros fosse a melhor maneira para o C.
Outra solução seria fazer a leitura sem utilizar ponteiros. De uma maneira mais parecida com o Java
Mas nessa segunda opção precisaria atribuir o retorno. Exemplo: aluno = lerNome(aluno);
Por isso vim até o fórum para saber se tinha uma maneira melhor de fazer isso.
Obs: Nao sei se poderei utilizar ponteiro. Pois, é um programa que deve armazenar as informacoes em um arquivo binario. E tive problemas para ler do arquivo utilizando estrutura com ponteiro.
Exemplo:
1)
O aluno é carregado com atributos estranhos.
2)
Sem o ponteiro a estrutura é carregada corretamente. Nao posso passar um parametro por referencia para a funcao fread?
|
Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 15:10:53
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Como o ViniGodoy mencionou anteriormente, fazer isto aqui:
é só um pouco pior que um NullPointerException. É que um ponteiro (não referência, que é uma outra coisa) em C não é inicializado, ou melhor, é inicializado com lixo. E se você pega o endereço desse endereço (que é o que você fez) e copia algum valor nele, vai ter algo mais nojento ainda.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 15:40:30
|
RafaelViana
GUJ Master
Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline
|
Ponteiros me confundem bastante. Porque aprendi a programar com Java que não tem ponteiros.
Resumindo: Sempre que possível evitar ponteiros?
|
Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 15:48:48
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Em C você não pode evitar os ponteiros.
Mas você sempre deve ser capaz de olhar um ponteiro em um programa e sempre saber dizer: "que valor contém esse ponteiro"?
No seu caso:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 15:58:14
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Normalmente em C você escreveria:
(Excetuando o fato que não sei a definição do campo "nome" de sua classe Aluno. )
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 17:21:05
|
RafaelViana
GUJ Master
Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline
|
Obrigado. Era esse "truque" que estava esperando como resposta.
Então, se o parametro de uma função exigir uma variável com ponteiro.
Posso passar (sem o compilador reclamar):
ou
Eu havia aprendido/entendido que só poderia passar referencia de ponteiro se fosse criada uma variavel com o ponteiro (*). Mas isso faz sentido. Agora entendi porque no scanf,fread, fwrite,... é exigido o & junto com a variavel.
Só pra finalizar nas dúvidas sobre ponteiros:
Então quando eu crio a variavel: Aluno aluno; fica alocado um espaço na memória para a variavel, como voce falou: o objeto foi criado. Se eu passar para a função o parametro &aluno. A função vai alterar os atributos desse aluno direto no endereço da memória. Esse endereço na memória é o ponteiro para o objeto criado.
Agora se eu criar uma variável Aluno *aluno; ela é apenas um ponteiro para algum endereço de memória. Como nenhum endereço foi atribuido ela não está apontando para nada (inclusive da esse erro se tentar olhar o valor do endereço da memória desse ponteiro: Must take address of a memory location).
No entanto, se eu tiver as funções como escrevi no inicio desse post ambas funcionam.
Por isso, fiz o seguinte teste:
E funcionou a leitura. (então tenho como usar daquela maneira com ponteiro a função fread, mas a maneira como você citou parece mais elegante).
Então ambas as soluções produzem o mesmo resultado?
Quanto ao lixo da variável criada com o ponteiro. Criei duas estruturas(com uma variavel do tipo inteiro dentro) uma com o ponteiro outra sem.
Na variavel sem ponteiro valor = -29147
Na variavel com ponteiro valor = 767
Não seriam ambos os valores lixo? (considerando que no Java o valor inteiro tem por padrão 0. O valor inteiro padrão no C é -29147? )
|
Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 17:37:53
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Amigo, o compilador C não lhe ajuda nem um pouco. Ele aceita quase tudo sem reclamar. Quando você faz isso:
ele não sai gritando, como no Java, que a variável "aluno" não está inicializada.
Na verdade, você teve sorte (ou azar) de o seu programa não ter dado um erro de execução.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2010 17:58:32
|
RafaelViana
GUJ Master
Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline
|
Ok. Obrigado pela explicação.
Por não ter experiência com o uso de ponteiros tomei como base para as conclusões apenas os testes que realizei. Como eles tiveram o mesmo resultado, achei que ambas situações produzissem o mesmo resultado.
Agradeço novamente a sua explicação e a sua disponibilidade para tirar minhas dúvidas.
|
Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." |
|
|
 |
|
|