kAworu's avatar

look at the star

publié par kAworu
il y a environ un an

Y a pas à discuter, les pointeurs en C, t'en bave grave. C'était violent, surtout avec mon background Java (pwerk). Java c'est abjec^Wobjet, et donc très orienté sur les types. Un truc qui m'a vraiment pas rendu la tâche facile c'était de lire des déclaration de pointeurs:

int *p;

Mais pourquoi diantre les gens n'écrivaient pas plutôt

int* p;

Après tout, la variable c'est p et son type c'est int*. et quand on initialise en même temps que la déclaration, ça donne l'impression de déférencer, et c'est confusant™.

I'm gonna work my way

Alors comme beaucoup (j'avoue, mais j'avoue!) , j'ai écris int* p (je suivais pas style(9) à l'époque, j'avais ma propre guideline, mes propres rêves; j'étais le roi du monde) sans chercher vraiment à comprendre pourquoi les autres faisaient différemment, juste parce que ça me semblait plus clair et logique. J'étais pas le seul (et y'en a encore), car pas mal de projets utilisent cette syntaxe.

Par exemple rtorrent que j'avais hacké pour qu'il soit plus vim compliant, dont voilà un bout de src/command_helpers.h (attention les yeux, c'est du C++):

extern rpc::CommandSlot<void>    commandSlots[COMMAND_SLOTS_SIZE];
extern rpc::CommandSlot<void>*   commandSlotsItr;
extern rpc::CommandVariable      commandVariables[COMMAND_VARIABLES_SIZE];
extern rpc::CommandVariable*     commandVariablesItr;
extern rpc::CommandObjectPtr     commandObjectPtrs[COMMAND_OBJECT_PTR_SIZE];
extern rpc::CommandObjectPtr*    commandObjectPtrsItr;
/* ... */
void
add_variable(const char* getKey, const char* setKey, const char* defaultSetKey,
             rpc::Command::cleaned_slot getSlot, rpc::Command::cleaned_slot setSlot,
             const torrent::Object& defaultObject);

Dans le lot y a aussi ce bon vieux htop, qui est écrit en C (enfin j'ai des doutes), un petit bout de htop.c pour la route (je viens de tilter sur l'indentation de 3 char. srsly, wtf.)

/* ... */
static void addUserToVector(int key, void* userCast, void* panelCast) {
   char* user = (char*) userCast;
   Panel* panel = (Panel*) panelCast;
   Panel_add(panel, (Object*) ListItem_new(user, key));
}
/* ... */

et bam

Et un jour, t'as un bug. Ça t'arrives tout le temps quand t'as l'âme créative et que tu sors ton vim, mais cette fois-çi c'est différent.

int
main(void)
{
    int     question, answer;
    int*    pq, pa;

    question = -1;
    answer   = 42;
    pq = &question;
    pa = &answer;

    return (answer);
}
% clang machin.c
machin.c:10:8: warning: incompatible pointer to integer conversion assigning to 'int' from 'int *'
    pa = &answer;
       ^ ~~~~~~~

Donc notre compilateur qui warn dit que pa est de type int, alors qu'on voulait un (int *) (on remarque au passage que c'est un bug violent mais qui génère juste un warning. On devrait prendre la bonne habitude de compiler avec -Werror la plus part du temps). Si on réécrit la déclaration ça devient beaucoup plus clair:

    /* ... */
    int     *pq, pa;
    /* ... */

Maintenant c'est plus clair que pq est de type (int *) et pa de type int. Donc voilà, c'est bête mais c'est comme ça. Du coup il faut soit l'écrire comme précédement, soit faire une déclaration par ligne:

    int*    pq;
    int*    pa;

Pour completer tout ça voici des liens à bookmarker (apprendre par coeur) sur le sujet:

cinq commentaires

écrire un commentaire

  1. Natacha il y a environ un an Natacha's avatar

    Et pour les gens qui aiment penser comme le Standard, pour la grammaire C int * p; ça veut dire *p est déclaré être de type int. C'est d'ailleurs là la cause profonde du problème de dans int * pq, pa;, comme * est un opérateur unaire préfixe de pq, et n'a aucun rapport direct avec int, il est « prioritaire » sur la virgule et n'est pas « distribué » à pa.

  2. papers buy il y a quatre mois papers buy's avatar

    As I see you work really hard to have such results which you have now!

  3. custom writing il y a quatre mois custom writing 's avatar

    I used this information in my work. It's really useful.

  4. resume writing il y a quatre mois resume writing  's avatar

    Fabulous! This blog looks strictly like my disintegrated a certain! It's on a unqualifiedly other grounds but it has lovely much the uniform episode layout and design. Champion selection of colors!

  5. link building services il y a environ un mois link building services's avatar

    Too many sites offer buy term papers online, and it really helps. I'm glad I found this site it is quite interesting and cognitive

écrire un commentaire:


(utilisé pour gravatar, ne sera pas affiché)



tu peux utiliser la syntaxe markdown :)