OVH Cloud OVH Cloud

allocation dynamique d'un pointeur

56 réponses
Avatar
prat
bonjour,

J'ai vu dans un bouquin de cours de langage C sur les pointeurs
l'algorithme suivant:

main( )
{
float * pr1,*pr2,*pr3,somme=3D0;


/*allocation dynamique */
pr1=3Dmalloc(sizeof(float));
pr2=3Dmalloc(sizeof(float));
pr3=3Dmalloc(sizeof(float));

/*saisie*/
printf("Entrez 3 notes: ");
scanf("%f %f %f ",pr1,pr2,pr3);

/*calcul de la somme*/
somme=3D*pr1+ *pr2+ *pr3;

/*calcul de la moyenne*/
printf("Moyenne :%f \n ",somme/3);

/*liberation de la m=E9moire*/
free(pr1);
free(pr2);
free(pr3);

}

Mes questions sont:
-les pointeurs ont =E9t=E9 d=E9clar=E9 initialement =E0 la premi=E8re
instruction,pourquoi en plus une allocation dynamique avec malloc( ) et
free( )?Est-elle n=E9cessaire?
-aurai-je pu utiliser l'allocation dynamique sans avoir au pr=E9alable
d=E9clar=E9 mes pointeurs comme =E0 la premi=E8re instruction?


merci.

10 réponses

2 3 4 5 6
Avatar
espie
In article ,
Marc Boyer wrote:
Et moi, je ne parle pas de mon expérience d'apprenant (car vu que j'ai
commencé vers 12-13 ans, je n'ai aucun souvenir du moment ou j'ai
compris les pointeurs), mais de ce que je vois des cours que je donne.
Et je vois bien que les explications à base d'adresse ne passent
pas, hormis pour une minorité.


Est-ce que tu fais du suivi sur les gens a qui tu donnes des cours ?

Dans les etudiants pour qui les explications a base d'adresse `ne passent
pas', combien d'entre eux continuent a faire du C a un niveau interessant
apres ?

Est-ce vraiment souhaitable de leur enseigner le C, d'ailleurs ? Quel
interet presente encore le C si on ne maitrise pas les manipulations
d'adresses ? pourquoi ne pas aller directement faire du java dans ce cas.

Avatar
Marc Boyer
Le 23-01-2007, Marc Espie a écrit :
In article ,
Marc Boyer wrote:
Et moi, je ne parle pas de mon expérience d'apprenant (car vu que j'ai
commencé vers 12-13 ans, je n'ai aucun souvenir du moment ou j'ai
compris les pointeurs), mais de ce que je vois des cours que je donne.
Et je vois bien que les explications à base d'adresse ne passent
pas, hormis pour une minorité.


Est-ce que tu fais du suivi sur les gens a qui tu donnes des cours ?


Plus ou moins. Je les vois encore 2 ans, et on a plus ou moins des
contacts une fois qu'ils sont diplomés.

Dans les etudiants pour qui les explications a base d'adresse `ne passent
pas', combien d'entre eux continuent a faire du C a un niveau interessant
apres ?


Je pense qu'aucun de mes étudiants ne fait du C 'a un niveau
interessant' après, ou 3-5% peut-être.

Est-ce vraiment souhaitable de leur enseigner le C, d'ailleurs ?


Oui. On trouve peu de Java sur les DSP ou dans les noyaux d'OS.

Quel
interet presente encore le C si on ne maitrise pas les manipulations
d'adresses ?


Doucement. Je n'ai pas dit qu'il ne fallait pas connaître la notion
d'adresse. J'ai juste dit que pour faire la première approche, le
premier déclic, se contenter de dire qu'un pointeur est une adresse
ne fonctionne pas pour une majorité d'étudiants.

pourquoi ne pas aller directement faire du java dans ce cas.


On y pense ;-)

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Marc Boyer
Le 23-01-2007, Harpo a écrit :
Marc Boyer wrote:
Et on rajoute 6h de cours et 6h de TD d'archi des ordis à l'emplois
du temps parce que le prof qui enseigne le C en a besoin pour
illustrer la notion de pointeur ? Ben non, on a pas assez d'heures à
l'emploi du temps pour jouer à ça.


Je vous comprends mais pour moi on n'échappe pas facilement au fait
qu'il faille un certain ordre dans la manière de faire comprendre.


Un enseignant ayant plus de bouteille que moi racontait que dans
les années 70-80, on enseignait le C *après* que les étudiants
sachant coder en assembleur, et la communauté était agité par
le débats du genre "comment peut on enseigner le C à des personnes
qui ne connaissent pas l'assembleur ?". Et ca discutait dur,
les anciens contre les modernes...

A ce jour, je ne connais pas de cursus où l'on fasse de la
maîtrise de l'assembleur un pré-requis.

Et il est vrai que certaines connaissances ont été perdues,
et que quand on code en C, on ne sait plus bien combien d'octet
de code vont être produits et en combien de cycle tout cela
s'exécutera (ce à quoi il semble qu'on était plus attentif
à une époque). Est-ce grave ?

Le C est un langage d'assez bas niveau qui demande d'avoir une vision,
de toute manière plus où moins abstraite d'une machine.


Tout est dans le dosage entre le plus et le moins.

Pour moi, c'est simple, mon interprétation naïve est suffisante pour me
faire une représentation et ce n'est pas à moi qui ai mon certificat
d'études primaires qu'on va faire croire que c'est difficile
d'expliquer ce qu'est une adresse à un étudiant qui fait des grandes
études, vraiment j'ai du mal à trouver plus simple comme concept.


Primo, il y a longtemps que je ne crois plus que le plus haut
diplome obtenu donne une indication exacte des capacités intellectuelles
de la personne, et encore moins de la capacité à programmer.

Ensuite, un des grands problème de l'enseignement, c'est qu'on demande
à des gens qui ont réussit dans une matière de l'enseigner à une masse,
et qu'il ne faut pas prendre son parcours comme référence, puisqu'en
général, on a pas identifié les difficultés que les autres rencontrent.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Antoine Leca
Marc Espie écrivit dans news:ep2to1$30s$:
In article ,
Pascal Bourguignon <> wrote:
Et même le vieux K&R C, avec les accolades:

[corrigé]


int f(x)int x;{
int y=x+1;
g(y);


Ensuite, tu as des contraintes tres fortes sur ce que tu as le droit
de mettre dans une expression d'initialisation en C traditionnel,


Euh ? À quoi penses-tu en l'occurence ?
J'ai pas mon bouquin sous la main, mais il me semble bien qu'une opération
sur des entiers rentrait dans le domaine du possible...

D'un autre côté, il est vrai que certains compilateurs des années 80
n'admettaient pas ce genre de choses, mais c'était du genre compilos pour
machines 8 bits...


contraintes qui ont ete levees en C99.


Euh ?? À quoi penses-tu ici ?
ÀMC, C99 ajoute de nouvelles fonctionnalités (indiçage explicite, «
désignés »), et bien sûr les tableaux dynamiques et les littéraux
composites. Mais rien que se rapporte aux scalaires ou aux contraintes
d'initialisation.


Le vrai changement en C99 (et la raison pour être obligé d'écrire "int"),
c'est bien sûr que l'on peut maintenant mélanger déclarations et
instructions.


Antoine


Avatar
Pascal Bourguignon
Marc Boyer writes:
Quel
interet presente encore le C si on ne maitrise pas les manipulations
d'adresses ?


Doucement. Je n'ai pas dit qu'il ne fallait pas connaître la notion
d'adresse. J'ai juste dit que pour faire la première approche, le
premier déclic, se contenter de dire qu'un pointeur est une adresse
ne fonctionne pas pour une majorité d'étudiants.


Bin non, il faut expliquer ce qu'est une adresse. Mais c'est
justement ça qui n'est pas difficile et qui est trés éclairant.

En fait, nous sommes tirés dans deux dirrections opposées, vers
l'abstraction théorique, et vers le pragmatisme de l'implémentation
concrête.

Oui, un pointeur pourrait être un type abtrait contenant le nom de la
variable référée et d'un déplacement (pour les vecteurs), ou on
pourrait faire un autre dévelopement abstrait avec une théorie de
types.

Mais c'est surement plus facile de comprendre, pour un débutant, en
expliquant comment ça fonctionne réellement. Pour des enfants, on
peut même en faire un jeu avec des casiers et des petits papiers...





La mémoire est une longue suite de case numérotées de 0 à (B^N)-1, et
dans chaque case, on peut enregistrer un numéro de 0 à (B^W)-1.

En supposant W=N et B pour faire un exemple simple, on peut mettre
en memoire un vecteur contenant (3 2 1 0) à l'adresse 1000, et alors
on peut mettre à l'adresse 2000, un "pointeur" vers ce vecteur, c'est
à dire l'adresse 1000:

+------+
0000: | |
+------+
0001: | |
+------+
...
+------+
1000: | 0003 |
+------+
1001: | 0002 |
+------+
1002: | 0001 |
+------+
1003: | 0000 |
+------+
...
+------+
2000: | 1000 |
+------+
...
+------+
9999: | |
+------+

Et donc, en partant de la case mémoire à l'adresse 2000, on peut
accéder au deuxième élément du vecteur, en lisant ce qui se trouve
dans la case de l'adresse 2000, soit 1000 et en additionnant 1, soit
1001, et en lisant ce qui se trouve dans la case 1001, soit 2.

Et si on veut accéder à un autre vecteur, qui se trouve en 1500, il
suffit de mettre à jour la case de l'adresse 2000 et y stocker 1500.

Une variable pointeur est donc une case comme celle à l'adresse 2000,
et une variable vecteur une série de case comme celles entre les
adresses 1000 et 1003.


--
__Pascal Bourguignon__ http://www.informatimago.com/

"By filing this bug report you have challenged the honor of my
family. Prepare to die!"


Avatar
Pascal Bourguignon
Marc Boyer writes:
[...]
A ce jour, je ne connais pas de cursus où l'on fasse de la
maîtrise de l'assembleur un pré-requis.

Et il est vrai que certaines connaissances ont été perdues,
et que quand on code en C, on ne sait plus bien combien d'octet
de code vont être produits et en combien de cycle tout cela
s'exécutera (ce à quoi il semble qu'on était plus attentif
à une époque). Est-ce grave ?


On peut aussi ne pas avoir lu Balzac ou Hugo. Est-ce grâve?

À mon avis, avoir programmé (et optimisé) quelques programmes en
assembleur tôt dans une vie de programmeur est un bagage culturel
important.


--
__Pascal Bourguignon__ http://www.informatimago.com/

PLEASE NOTE: Some quantum physics theories suggest that when the
consumer is not directly observing this product, it may cease to
exist or will exist only in a vague and undetermined state.

Avatar
Marc Boyer
Le 23-01-2007, Pascal Bourguignon a écrit :
Marc Boyer writes:
A ce jour, je ne connais pas de cursus où l'on fasse de la
maîtrise de l'assembleur un pré-requis.

Et il est vrai que certaines connaissances ont été perdues,
et que quand on code en C, on ne sait plus bien combien d'octet
de code vont être produits et en combien de cycle tout cela
s'exécutera (ce à quoi il semble qu'on était plus attentif
à une époque). Est-ce grave ?


On peut aussi ne pas avoir lu Balzac ou Hugo. Est-ce grâve?


Tout Balzac ou tout Hugo ou un peu de Balzac et un peu d'Hugo ?

À mon avis, avoir programmé (et optimisé) quelques programmes en
assembleur tôt dans une vie de programmeur est un bagage culturel
important.


Qu'est-ce qu'un programmeur ?
Je ne forme pas des gens avec un diplome d'informatique, mais des
gens qui seront ammenees a programmer des choses dans leur specialite.

Donc, ils ont fait un peu d'assembleur, sans etre tout a fait
a l'aise avec. Je ne pense pas qu'ils aient optimise quoi que
ce soit.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Marc Boyer
Le 23-01-2007, Pascal Bourguignon a écrit :
Marc Boyer writes:
Quel
interet presente encore le C si on ne maitrise pas les manipulations
d'adresses ?


Doucement. Je n'ai pas dit qu'il ne fallait pas connaître la notion
d'adresse. J'ai juste dit que pour faire la première approche, le
premier déclic, se contenter de dire qu'un pointeur est une adresse
ne fonctionne pas pour une majorité d'étudiants.


Bin non, il faut expliquer ce qu'est une adresse. Mais c'est
justement ça qui n'est pas difficile et qui est trés éclairant.


Et bien je conteste cette simplicite, et j'en veut pour preuve
le fait que c'est l'explication la plus repandue pour parler
des pointeurs et qu'elle ammene des tas de debutants a ne pas
bien comprendre (cf OP).

En fait, nous sommes tirés dans deux dirrections opposées, vers
l'abstraction théorique, et vers le pragmatisme de l'implémentation
concrête.


Non. Cette distinction emloie des termes qui ne sont pas neutres.
Je ne fais pas de l'abstraction theorique (cf les mail de Gaby sur
l'espace de nommage), et je refute l'idee que l'implantation
concrette soit accessible sans un bagage d'archi.
Je cherche a presenter la *semantique* en utilisant des
mots comprehensibles a ce niveau de connaissance (si je
voulais etre exact, je n'utiliserais pas le terme 'variable'
mais le terme de la norme 'object').

Oui, un pointeur pourrait être un type abtrait contenant le nom de la
variable référée et d'un déplacement (pour les vecteurs), ou on
pourrait faire un autre dévelopement abstrait avec une théorie de
types.

Mais c'est surement plus facile de comprendre, pour un débutant, en
expliquant comment ça fonctionne réellement. Pour des enfants, on
peut même en faire un jeu avec des casiers et des petits papiers...

La mémoire est une longue suite de case numérotées de 0 à (B^N)-1, et
dans chaque case, on peut enregistrer un numéro de 0 à (B^W)-1.

En supposant W=N et B pour faire un exemple simple, on peut mettre
en memoire un vecteur contenant (3 2 1 0) à l'adresse 1000, et alors
on peut mettre à l'adresse 2000, un "pointeur" vers ce vecteur, c'est
à dire l'adresse 1000:

+------+
0000: | |
+------+
0001: | |
+------+
...
+------+
1000: | 0003 |
+------+
1001: | 0002 |
+------+
1002: | 0001 |
+------+
1003: | 0000 |
+------+
...
+------+
2000: | 1000 |
+------+
...
+------+
9999: | |
+------+

Et donc, en partant de la case mémoire à l'adresse 2000, on peut
accéder au deuxième élément du vecteur, en lisant ce qui se trouve
dans la case de l'adresse 2000, soit 1000 et en additionnant 1, soit
1001, et en lisant ce qui se trouve dans la case 1001, soit 2.

Et si on veut accéder à un autre vecteur, qui se trouve en 1500, il
suffit de mettre à jour la case de l'adresse 2000 et y stocker 1500.

Une variable pointeur est donc une case comme celle à l'adresse 2000,
et une variable vecteur une série de case comme celles entre les
adresses 1000 et 1003.


Oui, c'est un peu comme c§a ue je faisais mon cours. Et ca ne marche
pas. En vrac, comment lier cela a l'allocation dynamique, a
l'arithmetique des pointeurs, et pourquoi les variables locales
disparaissent, etc.

Entendons nous bien, je ne dis pas qu'il faille cacher tout
cela. on leur dit, plusieurs fois dans l'annee et dans divers
cours. Ce que je dis est que presenter les pointeurs comme
cela n'est pas tres efficace.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)



Avatar
Antoine Leca
Pascal Bourguignon écrivit dans
news::
Marc Boyer writes:
Doucement. Je n'ai pas dit qu'il ne fallait pas connaître la notion
d'adresse. J'ai juste dit que pour faire la première approche, le
premier déclic, se contenter de dire qu'un pointeur est une adresse
ne fonctionne pas pour une majorité d'étudiants.


Bin non, il faut expliquer ce qu'est une adresse.


On parle bien de la manière d'aborder les pointeurs pour la première fois,
d'accord ? (Tout le monde est d'accord pour dire que pour « savoir
programmer » en C, il faut maîtriser la notion d'adresse et le fait qu'un
pointeur contienne une adresse ; le débat n'est pas là, il est sur le mode
d'apprentissage, et l'ordre.)


Mais c'est justement ça qui n'est pas difficile et qui est
trés éclairant.


Mouais. Je trouve que si l'on aborde les pointeurs par ce sens-là, il est
ensuite très difficiel de comprendre comment marche les tableaux. ÀMHAP.
Mais je ne suis pas prof, donc je laisse ceux qui savent débattre.


En fait, nous sommes tirés dans deux dirrections opposées, vers
l'abstraction théorique, et vers le pragmatisme de l'implémentation
concrête.


On parle seulement du point de départ. Il est bien évident qu'à partir de ce
point, chacun va progresser dans le sens de l'autre, puisque vous avez tous
deux le même but (je pense).



Et si on veut accéder à un autre vecteur, qui se trouve en 1500, il
suffit de mettre à jour la case de l'adresse 2000 et y stocker 1500.


Et il est TRÈS simple d'expliquer que lorsque le pointeur est un char*, il
faut ajouter 500, et quand c'est un int*, il faut ajouter tantôt 250, et
tantôt 125.
Évidentissime.


Antoine


Avatar
Pascal Bourguignon
Marc Boyer writes:

Le 23-01-2007, Pascal Bourguignon a écrit :
Marc Boyer writes:
A ce jour, je ne connais pas de cursus où l'on fasse de la
maîtrise de l'assembleur un pré-requis.

Et il est vrai que certaines connaissances ont été perdues,
et que quand on code en C, on ne sait plus bien combien d'octet
de code vont être produits et en combien de cycle tout cela
s'exécutera (ce à quoi il semble qu'on était plus attentif
à une époque). Est-ce grave ?


On peut aussi ne pas avoir lu Balzac ou Hugo. Est-ce grâve?


Tout Balzac ou tout Hugo ou un peu de Balzac et un peu d'Hugo ?


Justement, l'avantage avec les écrivains morts, c'est qu'on peut lire
l'oeuvre complète. :-)

À mon avis, avoir programmé (et optimisé) quelques programmes en
assembleur tôt dans une vie de programmeur est un bagage culturel
important.


Qu'est-ce qu'un programmeur ?
Je ne forme pas des gens avec un diplome d'informatique, mais des
gens qui seront ammenees a programmer des choses dans leur specialite.

Donc, ils ont fait un peu d'assembleur, sans etre tout a fait
a l'aise avec. Je ne pense pas qu'ils aient optimise quoi que
ce soit.


Je ne demande pas forcément quelque chose de compliqué. Ce qui compte
c'est qu'ils aient eu l'occasion de fouiller dans le manuel de
référence d'un processeur, de compter le nombre de cycles que prend
leur petit programme, et qu'ils aient fait l'effort de trouver une
combinaison d'instructions plus rapide. Quitte à leur montrer ensuite
comment rendre le programme trois fois plus rapide avec deux fois
moins d'effort en implémentant un meilleur algorithme...

--
__Pascal Bourguignon__ http://www.informatimago.com/

"A TRUE Klingon warrior does not comment his code!"



2 3 4 5 6