Ir para o conteúdo
magician

Apontadores errados :S

Mensagens Recomendadas

magician    2
magician

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;

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

é 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]'.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
magician    2
magician

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 ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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));

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
shumy    17
shumy

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
magician    2
magician

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
magician    2
magician

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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").

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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' :)).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
magician    2
magician

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:

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade