duvidas: ponteiros em struct e alocação dinâmica - parte 1 [RESOLVIDO]

1. duvidas: ponteiros em struct e alocação dinâmica - parte 1 [RESOLVIDO]

ROBISON PEREIRA MACHADO
robisonmachado

(usa Arch Linux)

Enviado em 21/12/2010 - 21:21h

Pessoal, olá para todos e obrigado por estarem gastando um pouco do tempo de vocês comigo.

Bem, sou programador iniciante em C, já entendo algumas coisas, contudo estou tendo um problema na manipulação de ponteiros para ponteiros que referenciam structs que contém campos ponteiros.
O código pode ser conferido no link: http://ideone.com/4QbNl.

Vejam também aqui:


#include<stdio.h>
#include<stdlib.h>
////// ORIGINALMENTE AS FUNÇÕES ESTÃO EM ARQUIVOS SEPARADOS

// DECLARAÇÃO DA STRUCT A SER EXPLORADA
typedef struct registro_agenda{
char *name;
char *adress;
int *phone;
struct registro_agenda *next;
} registro;

// FUNÇÃO PARA ALOCAR MEMÓRIA PARA UM TIPO "REGISTRO",
// OBSERVE QUE ELA TEM RETORNO "VOID" PROPOSITALMENTE E
// COMO ARGUMENTO RECEBE O ENDEREÇO DE UM PONTEIRO DO TIPO "REGISTRO"
void aloca_registro(registro **ptr_registro, int len_name, int len_adress){

*ptr_registro = (registro *)malloc(sizeof(registro));
*ptr_registro->name = (char *)malloc(len_name*sizeof(char));
*ptr_registro->adress = (char *)malloc(len_adress*sizeof(char));
*ptr_registro->phone = (int *)malloc(sizeof(int));
*ptr_registro->next = NULL;

}

// FUNÇÃO PARA PREENCHIMENTO DE UM TIPO "REGISTRO"
preencher_registro(registro **ptr_registro){
int yes=1;
while(yes){
printf("\n\tDIGITE O NOME: ");
scanf("%s",**ptr_registro->nome);

printf("\n\tDIGITE O ENDERECO: ");
scanf("%s",**ptr_registro->adress);

printf("\n\tDIGITE O TELEFONE: ");
scanf("%i",**ptr_registro->phone);

printf("GOSTARIA DE COLOCAR MAIS UM CONTATO NA AGENDA?");
printf("\n\t0 - NAO\n\t1 - SIM");
scanf("%i", &yes);

if(yes == 1) {
*ptr_registro = *ptr_registro->next;
aloca_registro(**ptr_registro,30,50);
continue;
}
else break;
}

}

// FUNÇÃO PARA MOSTRAR UMA AGENDA NO CONSOLE
mostrar_agenda(registro **ptr_registro){
int reg=1;
while(*ptr_registro != NULL){
printf("MOSTRANDO REGISTRO %i", reg++);
printf("\tNOME %s\n", **ptr_registro->name);
printf("\tENDERECO %s\n", **ptr_registro->adress);
printf("\tTELEFONE %i\n", **ptr_registro->phone);
printf("----------------------------------------------------------------\n\n");
*ptr_registro = *ptr_registro->next;
}


}

int main(){
registro *agenda=NULL;
printf("Teste de ponteiros para ponteiros, structs com ponteiros e funções com esses tipos de dados\n");

aloca_registro(&agenda,30,50);
preencher_registro(&agenda);
mostrar_agenda(&agenda);
return 0;
}



O problema é que eu não sei passar os campos nome, endereço e telefone para as funções.






  


2. Refaça a estrutura

Ezequias Rocha
Ezequias Rocha

(usa Ubuntu)

Enviado em 22/12/2010 - 08:19h

A princípio, não é possível entender o propósito da estrutura criada, ela me parece ser uma estrututa "recursiva", entende? Veja bem:

typedef struct registro_agenda{
char *nome;
int idade;
struct registro_agenda *registro_proximo;
struct registro_agenda *registro_anterior;
}registro;


Se está criando uma estrutura do tipo registro_agenda com nome registro, até ai ok. No entanto tal estrutura possui dois de seus elementos como sendo ponteiros para esta mesma estrutura, Como pode?
Pois bem, não sei se está faltanto membros na estrutura registro_agenda, porém, pode-se alterar toda esta construção como segue:


struct registro_agenda{
char *nome;
int idade;
}
typedef struct{
struct registro_agenda *registro_proximo;
struct registro_agenda *registro_anterior;
}registro;

É verdade, pode haver mais erros no código, todavia peço que comece por esta questão.

Embraces!


3. Obrigado

ROBISON PEREIRA MACHADO
robisonmachado

(usa Arch Linux)

Enviado em 22/12/2010 - 17:26h

Valeu, mas, eu notei que cometi um engano, vou editar o tópico.


4. Não tem ninguém que pode me ajudar?

ROBISON PEREIRA MACHADO
robisonmachado

(usa Arch Linux)

Enviado em 27/12/2010 - 17:45h

Pessoal, eu sei tem como a gente resolver um problema de diversas maneiras, às vezes, não é?, ou de uma maneira mais fácil ou de uma maneira mais difícil.

Eu resolvi fazer uma struct com todos os campos ponteiros por alguns motivos entre eles: 1) entendo alguma coisa sobre ponteiros e quero ampliar meu conhecimento sobre eles 2) Eu posso utilizar ponteiros para ponteiros para manipular o conteúdo de outros ponteiros simples 3) Há a possibilidade de redução de memória, já que se declararmos char nome[30], todas estruturas do mesmo tipo ocuparão 30 bits (para 1 char = 1 bit) na memória, mesmo que o nome só tenha 20 caracteres, enquanto char *nome me dá a possibilidade de, através de rotinas/funções, "pegar" somente a quantidade de memória suficiente para a string/vetor 4) Quero conhecer a linguagem C mais a fundo 5) Quero terminar esta bendita agenda de acordo com o exposto acima.

Até agora o meu problema é enviar como argumento os campos de um ponteiro do tipo registro, já devidamente apontado para uma variável dinamicamente criada, para a função:
void aloca_tipo(void **ptr2ptr, unsigned int qtd, char *tipo);

Se alguém puder dar um help eu agradeço, caso alguém não entender o que eu quero fazer posta aí que eu esclarecerei minuciosamente.

Obrigado a todos/todas que se dispuserem a me ajudar!



5. Re: duvidas: ponteiros em struct e alocação dinâmica - parte 1 [RESOLVIDO]

6. Re: duvidas: ponteiros em struct e alocação dinâmica - parte 1 [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 28/12/2010 - 10:16h


http://www.unidev.com.br/phpbb3/viewtopic.php?f=21&t=52699

A resposta eh a de "edvardjr"... TERCEIRO POST.



7. Obrigado a todos, contudo ainda não encontrei uma solução!

ROBISON PEREIRA MACHADO
robisonmachado

(usa Arch Linux)

Enviado em 02/01/2011 - 18:01h

Pessoal reformulei o post e coloquei um link que mostra o arquivo fonte que estou escrevendo na IDE.

A questão que eu apresentei se baseia que a maioria das vezes que a gente manipula ponteiros em C a gente faz uso de funções que retornam, agora e se quisermos implementar estas mesmas funções como rotina, ou seja, de retorno "void"? Aí teremos que manipular um ponteiro para ponteiro que recebe o endereço de um ponterio para o tipo de dado que queremos manipular.

A minha questão, não é a lógica da coisa, mas, sim, a sintaxe correta.


Obrigado a todos que contribuíram com respostas, vejo que esta comunidade realmente se autoajuda, assim como o VOL em si.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts