Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Flames

Listas...

Mensagens Recomendadas

Flames

Alguém me poderia explicar qual a diferença entre:

typedef struct lnode *List;
typedef struct lnode {
ITEM_TYPE info;
List next;
} List_node;

e

typedef struct node
{
   int value;
   struct node *next;
}Node;

é que sobre a segunda parte eu encontro código que me possa entender o que estou a fazer agora sobre a primeira parte esquece... O entendimento já é pouco dessa forma :S (o prof. insiste que a primeira é melhor não sei porque)

Editado por brunoais
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tirando o pormenor que a primeira definição não é completa porque ITEM_TYPE não está definido, tirando isso, é exactamente igual.

se o professor te diz que a primeira é melhor, é porque anda um bocado a leste sobre como dar nomes à coisas, para não falar que o segundo typedef é desnecessário e só complica. quanto muito seria:

typedef int ITEM_TYPE;
typedef struct lnode *List;
struct lnode {
ITEM_TYPE info;
List next;
};

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Em seguimento do que o HappyHippyHippo referiu, tenho também reparado que "está na moda" usar e abusar das typedefs em ambiente académico (eu antes também o fazia... mas nunca fui professor de programação). Desde typedefs desnecessárias até algumas claramente prejudiciais (como essa *List que oculta o facto de ser um apontador), não consigo perceber qual é o problema em usar directamente as structs.

Simples, directo e expressivo:

struct node {
 int value;
 struct node *next;
};

Editado por pwseo
  • Voto 2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

[...] não consigo perceber qual é o problema em usar directamente as structs.

É apenas açúcar sintático. É uma questão de legibilidade/abstracção. Se tiveres convenções de nomes bem definidas, diria que tornam o código mais legível.

Por exemplo, se disponibilizas uma API para listas, permitem ao utilizador da API abstrair-se da implementação da lista.

Acho que podemos comparar, por exemplo, com a utilização do NULL (macros em geral).

Ou até podemos comparar com a utilização de [Char] e String em Haskell.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Rui Carlos,

Estou a par do papel dos typedefs em C; estava apenas a questionar a forma como se usam em meio académico perante os iniciados na linguagem. Diria que não estão a construir nenhuma API que justifique um typedef, muito menos um que omita o operador de indirecção do resto do código, é uma má-prática.

Neste caso, e até por uma questão pedagógica, os alunos beneficiariam em usar a versão sem typedefs, até porque da forma que as coisas são ensinadas muitos ficam a pensar que só podes usar structs se tiverem typedefs também...

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Eu concordo que se deve ensinar primeiro não usando os typedefs. Mas também me parece razoável que depois se recomende o uso dos mesmos.

Este tipo de casos, em que estão a construir uma estrutura de dados genérica, parece-me uma aplicação razoável para typedefs (mais uma vez, assumindo que se sabe como os usar).

Não acho que haja propriamente um abuso dos typedefs, embora acredite que por vezes sejam usados sem que os alunos saibam bem o que estão a fazer. Até porque acho que é acaba por ser uma questão de preferências pessoais: se alguém entende que são úteis, usa-os, se entende que complicam, não usa. (Mas como dei a entender, sou mais adepto da sua utilidade. :D)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Eu também gosto de usar typedefs para estruturas de dados genéricas... E mesmo para outras coisas mais simples, gosto de aumentar a legibilidade com isso.

No entanto, e no caso em questão, a sua utilização não é benéfica (muito pelo contrário). A questão das preferências pessoais vem também apenas depois de se saber utilizar devidamente: parece que na Universidade é tudo dado em simultâneo e, como já disse, há quem pense que não se podem utilizar structs e typedefs separadamente, para não falar do problema em fazer typedef de apontadores e arrays! (que já vi em fichas de universidades)... Este tipo de utilização (sem explicação prévia do que é e sem consideração dos prós e contras) parece-me um abuso dos typedefs.

Repara, o objectivo de os usar é simplificar a escrita e compreensão de código e, no entanto, declarar um typedef para um apontador faz precisamente o contrário lool (e aqui resolvia-se simplesmente usando um asterisco a menos!)

Editado por pwseo

Partilhar esta mensagem


Ligação 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. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.