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

lesiano

[Dúvidas] Várias... :-[

12 mensagens neste tópico

i)Podemos ter mais q um typedef para uma estrutura? Isto é, ter:

typedef struct nodo *ABPInt;
typedef struct nodo NODO;

ii) Um apontador para char qts caracteres pode albergar no máximo?

iii) Qts caracteres tem uma linha?

iv) Imaginem isto:

struct nodo{
            int valor;
            ABPInt esq, dir;
            }*ASAS;

Para fazer um novo no:

ASAS novono;

novono = (ASAS)malloc(sizeof(nodo));

iv.i) Aqui o ASAS * era o q poria numa situação normal. Aqui ñ ponho como apontador pq ele é apontador só por si, ou ponho apontador mas atrás de "ASAS"?

iv.ii) sizeof(nodo) ou sizeof(struct nodo)? É engraçado q até um ponto do programa deu a primeira forma, mas a partir de certa altura, só msm com a segunda forma.

Obg. Sry pelo montão. :^)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(i) Sim.

(ii) Quantos conseguires alocar. Nunca vi mais nenhum limite.

(iii) Parece-me que essa pergunta não faz qualquer sentido... Uma linha é uma sequência de caracteres terminada por um '\n'. O número de caracteres da sequência não é fixo.

(iv.i) O que tinhas de pôr era struct nodo*. Se ASAS é um alias para esse tipo de dados (e já inclui o *), então não precisas do * para nada.

(iv.ii) Penso que deve ser struct nodo (se não me engano, só no C++ é que o struct não é necessário).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sry, tirei as perguntas abruptamente dos meus apontamentos.

Queria perguntar, na iii), se um ficheiro tem por definição um número máximo de chars numa linha. Não pois ñ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(iv.i) O que tinhas de pôr era struct nodo*. Se ASAS é um alias para esse tipo de dados (e já inclui o *), então não precisas do * para nada.

Imagina:

typedef struct pessoa{
                                    char nome[99+1];
                                    struct pessoa *prox;
                                    }PESSOA;

PESSOA *novono;

novono = (PESSOA *)malloc(sizeof(PESSOA));

Neste caso, o PESSOA (ASAS) já è um apontador. Logo, o q meter antes do malloc? Só ASAS? E no sizeof a msm coisa? :S   

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa é typedef struct xpto XPTO, outra é typedef struct xpto* XPTO.

Numa XPTO é equivalente a struct xpto (é uma estrutura e deves fazer XPTO* x=(XPTO*)malloc(sizeof(XPTO)) ou XPTO* x=(XPTO*)malloc(sizeof(struct xpto))).

Noutra XPTO é equivalente a struct xpto* (é um apontador para uma estrutura e deves fazer XPTO x=(XPTO)malloc(sizeof(struct xpto))).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O PESSOA não é apontador, é o nome pelo qual é conhecida a struct pessoa. Para ser apontador seria:

typedef struct pessoa {
char nome[99+1];
struct pessoa *prox;
} *PESSOA;

E aí já terias de fazer:

novono = (PESSOA)malloc(sizeof(struct pessoa));

O que metes dentro do sizeof é sempre um determinado número de bytes que correspondem ao nº de bytes que queres alocar. Logo terá de ser a identificação da struct neste caso. O que fazes antes um malloc é um casting para o tipo de apontador que vai endereçar o novo bloco de bytes a ser criado, uma vez que a função malloc devolve void*. Logo terá de ser um apontador para a struct pessoa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sr

O PESSOA não é apontador, é o nome pelo qual é conhecida a struct pessoa. Para ser apontador seria:

typedef struct pessoa {
char nome[99+1];
struct pessoa *prox;
} *PESSOA;

E aí já terias de fazer:

novono = (PESSOA)malloc(sizeof(struct pessoa));

O que metes dentro do sizeof é sempre um determinado número de bytes que correspondem ao nº de bytes que queres alocar. Logo terá de ser a identificação da struct neste caso. O que fazes antes um malloc é um casting para o tipo de apontador que vai endereçar o novo bloco de bytes a ser criado, uma vez que a função malloc devolve void*. Logo terá de ser um apontador para a struct pessoa.

Boa tarde, Sr.Eng..

O q eu disse q era um apontador era o ASAS, da primeira mensagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa é typedef struct xpto XPTO, outra é typedef struct xpto* XPTO.

Numa XPTO é equivalente a struct xpto (é uma estrutura e deves fazer XPTO* x=(XPTO*)malloc(sizeof(XPTO)) ou XPTO* x=(XPTO*)malloc(sizeof(struct xpto))).

Noutra XPTO é equivalente a struct xpto* (é um apontador para uma estrutura e deves fazer XPTO x=(XPTO)malloc(sizeof(struct xpto))).

Era o q eu pensava, então.

Esclarecido, obg. ;^)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agr, imagina q eu tenho um typedef *LInt.

Tenho q fazer uma função para inserir um nó. No parâmetro, a lista só levava um asterisco, certo?

Digo isto pq leva dois qd o typedef "ñ é apontador".

Neste exemplo, por exemplo:

typedef struct celula *LInt;

struct celula{
              int valor;
              LInt next;
              };
              
LInt insert_at(LInt*cabeca, int numero, int posicao){
...

temos o mesmo q aqui?

typedef struct celula LInt;

struct celula{
              int valor;
              LInt *next;
              };
              
LInt insert_at(LInt **cabeca, int numero, int posicao){
...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, podes sintetizar esse lixo todo que escreves fazendo apenas:

typedef struct celula {
int valor;
struct celula *next;
} LInt, *pLInt;

Assim, tens 1 struct com um int e um apontador para outra struct do mesmo tipo. Depois das chavetas podes colocar quer nomes que serão sinónimos do nome da struct (struct celula), como o LInt neste exemplo, e pelos quais a poderás referenciar, quer apontadores para esse tipo de dados (pLInt).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só está lá para ver se vocês sabem diferenciar as instruções.

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