Flames Posted April 23, 2013 at 01:21 AM Report #504429 Posted April 23, 2013 at 01:21 AM (edited) 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 April 23, 2013 at 06:08 PM by brunoais geshi
HappyHippyHippo Posted April 23, 2013 at 07:44 AM Report #504433 Posted April 23, 2013 at 07:44 AM (edited) 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 April 23, 2013 at 07:44 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pwseo Posted April 23, 2013 at 11:19 AM Report #504507 Posted April 23, 2013 at 11:19 AM (edited) 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 April 23, 2013 at 11:19 AM by pwseo 2 Report
Rui Carlos Posted April 25, 2013 at 12:01 PM Report #504782 Posted April 25, 2013 at 12:01 PM [...] 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. Rui Carlos Gonçalves
pwseo Posted April 25, 2013 at 05:53 PM Report #504828 Posted April 25, 2013 at 05:53 PM (edited) 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 April 25, 2013 at 05:59 PM by pwseo
Rui Carlos Posted April 25, 2013 at 06:44 PM Report #504836 Posted April 25, 2013 at 06:44 PM 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. 😄 ) Rui Carlos Gonçalves
pwseo Posted April 26, 2013 at 12:13 AM Report #504865 Posted April 26, 2013 at 12:13 AM (edited) 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 April 26, 2013 at 12:13 AM by pwseo
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now