Voilà en fait on a commencé la programmation en élec, (en C), et j'ai un peu de mal pour ce qui est des pointeurs.
On a pas vu de cours sur le C, on a directement commencé avec un Tp où il y a 3 pages pour expliquer les grandes lignes, et un exemple avec un truc qui allume des LEDS.
Je précise que mon prof est (très) bordélique, assez évasif dans les explications comme s'il était toujours pressé... Et quand un truc est évident pour lui, il considère que ça l'est aussi pour nous... Du coup quand il attaque un chapitre comme la programmation, c'est assez dur de suivre ![]()
Je précise aussi que j'ai quelques notions (je m'amusais à programmer des jeux sur ma Casio l'an dernier mais j'ai appris tout seul en essayant au hasard, alors ce sont pas forcément des bonnes bases...)
En fait le programme, c'est ça :
char *portb;
char SORTIE;
int PORTB;
void main()
{
PORTB=0x1004;
portb=PORTB;
SORTIE=0;
}
(il y a quelques commentaires qui n'aident pas beaucoup, en fait la valeur 0 ou E0 va s'afficher en binaire sur des leds)
Dans la suite du TP le programme s'allonge un peu mais la seule partie qui me pose problème c'est ça.
Ce que j'avais compris de premier abord, et avec les fiches en début de TP, c'est que :
*portb est un pointeur (à cause de l'étoile), SORTIE et PORTB sont des variables
on donne la valeur 0x1004 à PORTB, puis on donne la valeur PORTB à portb, et enfin la valeur 0 à SORTIE
à l'adresse indiquée par portb (0x1004), on met la valeur de SORTIE. Puis on y met la valeur 0xE0.
Donc selon moi, un pointeur aurait une valeur (0x1004 ici) qui correspond à l'adresse d'une autre variable. *portb désignerait la valeur de cette autre variable.
Quand j'ai demandé des précisions au prof, il m'a totalement embrouillé
Ce que j'ai compris de ce qu'il m'a dit :
les * ne servent à rien, on pourrait très bien les enlever (il l'a fait, le programme ne marchait plus, après 30 min à chercher dans les menus il les a remises et ça remarchait.)
portb et SORTIE sont des variables, PORTB est un pointeur. Quand je lui ai demandé comment on reconnaissait les variables des pointeurs, il a répondu "c'est normal puisque c'est un pointeur!". Quand j'ai insisté, il m'a dit que les pointeurs étaient forcément sur 16 bits sur ce micro contrôleur. (car les adresses vont de 0000 à FFFF)
on place la variable portb à l'adresse PORTB, puis on change sa valeur (d'abord 0, puis E0)
Voilà je suis un peu paumé, surtout l'histoire des * et de leur soi-disante inutilité, ça me paraît louche... En cherchant un peu sur le net, ça semble plutôt pencher de mon côté (enfin, du côté de la fiche dans son TP).
Pour moi * est indispensable et signifie que portb est un pointeur et les deux autres sont des variables :/
Confirmation :
http://www.squalenet.net/fr/ti/tutorial_c/11-pointeurs.php5
Jerry du prof qui ose dire que * ou pas * c'est la même chose. ![]()
pourquoi t'as besoin de pointeurs ?
char *portb; // declaration du pointeur *portb
char SORTIE; //
int PORTB;
void main()
{
PORTB=0x1004; // affectation de l'adresse 0x1004 à PORTB (qui doit correpondre aux Led)
portb=PORTB; // le pointeur pointe sur PORTB, si tu affectes à *portb une valeur x alors PORTB=x
SORTIE=0;
}
Et donc ton prof a raison.
Il suffit de se dire que les pointeurs ne présentent qu'un intérêt de rapidité d'exécution et un code plus propre. Tout est toujours réalisable sans les pointeurs.
Non. Une fonction ne peut rendre plusieurs images qu'en utilisant des pointeurs.
Ok cj j'ai compris, en gros c'est ce qu'a dit mon prof mais c'est bien *portb le pointeur et non PORTB.
PORTB=0x1004; // affectation de l'adresse 0x1004 à PORTB (qui doit correpondre aux Led)
Par contre là comment on sait qu'on lui affecte une adresse et non qu'on donne une valeur à la variable ?
Nan là on donne une valeur à PORTB. Pas une adresse.
Par contre cette valeur servira d'adresse ensuite. Puisqu'elle est stockée par le pointeur *portb juste après.
Ben ça c'est ce que j'ai dit dans mon premier post
Je me suis peut être mal exprimé.
PORTB=0x1004;
portb=PORTB;
Si on fait ça, est-ce que c'est PORTB qui va être égal à 0 ou la variable qui se trouve à l'adresse 0x1004 ?
C'est la valeur de la variable pointée par portb qui va être égale à 0. C'est à dire la variable d'adresse 0x1004.
Rappel :
Si je créé un pointeur *pointeursurbidule par exemple :
int bidule = 0;
int *pointeursurbidule = NULL;
pointeursurbidule = &bidule; //pointe sur bidule
C'est à dire que quand tu mets un * à ton pointeur c'est pour affecter une valeur. Sans * c'est pour affecter une adresse.
En gros si je m'amuse à faire dans cet exemple un affichage :
printf("%ld", pointeursurbidule); //affiche l'adresse pointée, ie l'adresse de bidule
printf("%ld", *pointeursurbidule); //affiche la valeur de la variable pointée, ie la valeur de bidule
Les variables globales, tu connais ? Tu n'as pas fait de C, en C on ne disposait que de ça. Les pointeurs rendent les programmes plus rapides, mais absolument tout est réalisable sans pointeur, dans une programmation qu'on qualifierait peut-être aujourd'hui de "pas très propre", mais qui était très utilisée quand le C++ n'existait pas.
T'es en train de dire que les pointeurs existent que en C++ ? :/
Ce qui est totalement faux.
Je me suis mal exprimé. Ce que je veux dire, c'est qu'au début, les pointeurs étaient peu utilisés ; on travaillait beaucoup plus avec des variables globales, car le problème d'optimisation ne s'exprimait que pas ou peu. Il faut comprendre qu'il est tout à fait possible de faire exactement le même programme sans ou avec les pointeurs, ce que Tidus a apparemment réfuté. Maintenant, quand on parle d'optimisation, c'est autre chose.
Comment on fait des pointeurs sans en utiliser ? (en C)