Jump to content
Flames

Listas...

Recommended Posts

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)

Edited by brunoais
geshi

Share this post


Link to post
Share on other 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;
};

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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;
};

Edited by pwseo
  • Vote 2

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Edited by pwseo

Share this post


Link to post
Share on other 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 )

Share this post


Link to post
Share on other 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!)

Edited by pwseo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.