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:
Et pour les gens qui aiment penser comme le Standard, pour la grammaire C
int * p;ça veut dire*pest déclaré être de typeint. C'est d'ailleurs là la cause profonde du problème de dansint * pq, pa;, comme*est un opérateur unaire préfixe depq, et n'a aucun rapport direct avecint, il est « prioritaire » sur la virgule et n'est pas « distribué » àpa.As I see you work really hard to have such results which you have now!
I used this information in my work. It's really useful.
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!
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