• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

magician

Apontadores errados :S

19 mensagens neste tópico

Boas estou a fazer uma trabalho e por algum motivo que nao consigo saber qual quando coloco um valor em uma variável char* e depois coloca em outra char* outro valor elas ficas as duas com o mesmo valor :S

struct palavraT{
char *file;
int n_ocu;
int linhas[50];
int fim;
};

struct palavra{
struct palavra *pai, *fe, *fd;
enum Cor cor;
char *palavra;
struct palavraT **lista;
};

char *temp = (char *)malloc(32*sizeof(char *));
struct palavra *buff = (struct palavra *)malloc(sizeof(struct palavra *));
struct palavraT *buffT = (struct palavraT *)malloc(sizeof(struct palavraT *));

buff->palavra = strdup(temp);

buffT->file = (char *)malloc(strlen(source)*sizeof(char));

buffT->file = strdup(source);

O temp e o source tem ambos uma string diferentes quando coloco o temp no buff->palavra ele fica la mas ao colocar o source no buffT->file o buff->palavra vai ficar com esse valor também :S

A propósito depois posso fazer isto ?

buff->lista[t] = buffT;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acho que só está´s a alocar espaço para um apontador quando devias estar a alocar para uma estrutura....

sizeof(struct palavra *)

acho que devia ser

sizeof(struct palavra)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ao fazer isso esse falhar aqui:

while(buff->lista[t] != NULL){

Ai que confusão :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estás a alocar duas vezes espaço para a mesma string...

buffT->file = (char *)malloc(strlen(source)*sizeof(char));

buffT->file = strdup(source);

o strdup já aloca o espaço...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

'buff->lista' é um array?

e um conselho, usa typedef para não andares sempre a escrever struct.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é um struct palavraT **lista; :S em relação ao malloc e do strdup não é dai porque isso já tinha corrigido :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é um struct palavraT **lista; :S em relação ao malloc e do strdup não é dai porque isso já tinha corrigido :S

para que isso passe a ser um array tens que alocar espaço para ele, caso contrário não faz sentido fazeres 'buff->lista[t]'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Algo assim então

buff->lista = (struct palavraT **)malloc(sizeof(struct palavraT));

Correcto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isto assim fica com 1 problema :S

ao fazer

p buff->lista[0]->file ele retorna $5 = 0x0 só no buff->lista[2]->file é que retorna o nome do file. :S é normal só começar no 2 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Algo assim então

buff->lista = (struct palavraT **)malloc(sizeof(struct palavraT));

Correcto ?

assim era um array de struct de dimensão 1 (não sei se é isso que queres)!!

para mais posições é só multiplicar o tamanho.

buff->lista = (struct palavraT **)malloc(<tamanho_do_array>*sizeof(struct palavraT));

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que o  que pretendes é um array bidimensional.

Alocas com duas chamadas a malloc.

1. alocar espaço para os ponteiros palavraT

2. alocar espaço para estruturas palavraT

Ou

Alocar só com uma chamada fazendo os calculos totais de ocupação de espaço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois é :) e assim resolve também o problema de estar em 2 e não em 0 ;)

Brigadão Rui  O0 O0 O0

Isto C para programadores de Java :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora como posso resetar os valores do buff e do buffT?

É que tenho isto vai correr em um ciclo e uso o buff e buffT para guardar valores mas depois no fim do ciclo o buff vai ser colocado em uma arvore e quero voltar a usar o buff e buffT para a próxima volta do ciclo :S Acho que estou a fazer alguma coisa mal :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes usar o 'free' para libertar o espaço alocado através de malloc ou strdup (mas depois tens que voltar a alocar o espaço, por isso se calhar o melhor é escrever "por cima").

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e para fazer a copia do apontador ?

É que ao fazer x = buff ao mudar o buff ele vai mudar o x tambem nao ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e para fazer a copia do apontador ?

É que ao fazer x = buff ao mudar o buff ele vai mudar o x tambem nao ?

tens que criar uma função que copie campo a campo (assim como em Java tens que definir a função 'clone' :)).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ai que isto dos apontadores dá cabo de mim ;) lol

Tenho outro problema e acho que é um problema de referencia :S

Tenho esta função.

lerFicheiro(char *source ,struct palavra *palavras)

Que chamo assim


struct *palavra = cria();

lerFicheiro("Texto.txt",palavras);

A função cria() cria uma palavra com todos os campos a inicializados para ser a raiz da árvore!

O problema é que ao fazer

lista_rbt(struct palavra *t, int n)

lista_rbt(palavras,1);

o problema é que no lista_rbt ele para logo na condição que diz que a árvore esta vazia :S Mas eu segui o processo com o gdb e ele está a inserir ou pelo menos parece :D

:wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sem saber o que é que essas funções fazem não estou a ver qual é o problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora