Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Definition d'un "nom de tableau"

81 réponses
Avatar
candide
Ce que je fais là est un peu cavalier mais j'ouvre un fil pour répondre
au message de François, l'autre fil devenant vraiment trop anarchique.

Francois a écrit :

>
> « Le nom t d'un tableau est une *constante* de type pointeur dont la
> valeur est fixée une bonne fois pour toute au début de l'exécution du
> programme et n'est pas stockée en mémoire. »
>
> est-ce correct ? J'ai l'impression que oui bien sûr, mais je me trompe
> peut-être (sûrement).


Je ne comprends pas ton obstination à vouloir trouver une définition
parfaite de "nom d'un tableau", ce qui compte aussi c'est de savoir les
utiliser ces tableaux mais peut-être que tu ne pourras faire cela
qu'après avoir défini, ce en quoi on reconnait le matheux ;) .

Et maintenant tu compliques les choses en parlant non plus de tableau
mais de nom d'un tableau.


À mon avis, ta définition est totalement incorrecte même si je
vois bien l'idée.

"Un nom de variable est une constante" ? Bof, dans la
norme (que je la connais très mal, OK), les constantes et les noms de
variables (les identificateurs) ne sont pas dans la même catégorie de
"token" donc on ne peut pas dire formellement qu'un identificateur est
une constante.

"Un tableau est de type pointeur", c'est une horreur, un tableau est de
type tableau, c'est tout même si une expression de type tableau est,
dans certaines circonstances, convertie en pointeur.

La valeur de t est fixée une bonne fois pour toutes au début ? oui, me
semble-t-il et encore, je sens que certains vont chipoter.


"La valeur n'est pas stockée en mémoire" : à mon avis, non, un tableau
est un objet, comment on y accèderait sinon ?

Comme dit la faq de clc à propos de l'expression "un tableau est un
pointeur constant" (question 6.9) : un nom de tableau est constant dans
la mesure où on ne peut l'assigner mais une fois de plus, un tableau
n'est pas un pointeur.

10 réponses

1 2 3 4 5
Avatar
Francois
----------------------3.14---------------------------------------
object
region of data storage in the execution environment, the contents of
which can represent values
--------------------------------------------------------------------

Ce qui me gêne, c'est que dans


int toto[5]={0};
int titi[5]={0};

titi et toto seraient donc le même objet alors qu'ils représentent des
zones de stockage différentes.


Sans rien y connaître, je dirais que d'après la définition que tu donnes
juste avant, titi et toto ne sont pas le même objet car un objet "c'est
une région de stockage de données". titi et toto correspondent bien à
des régions de stockages différentes, non ?


Alors, finalement un tableau, ça n'existe pas !!!! ce qui existe c'est
un objet tableau, un identificateur de tableau et la valeur d'un
tableau. Ou je délire complètement ?


Tiens, on dirait que je t'ai contaminé avec mes questions
existentielles. :-))


François

Avatar
candide

Avec "int tab[10] ;"
- "variable de type tableau" ---> tab[2]


Je dirais : non.

Je dirais que tab[2] n'est pas une variable, et de toute façon tab[2]
est de type entier. Maintenant, tab dans l'expression tab[2] est une
expression de type tableau. Cette dernière est équivalente à tab+2 et
dans cette expression tab est converti en un pointeur vers un entier.



- "expression de type tableau" ---> tab

Je dirais que oui, de même que tab+2

ou 2 +tab .

Avatar
candide


Sans rien y connaître, je dirais que d'après la définition que tu donnes
juste avant, titi et toto ne sont pas le même objet car un objet "c'est
une région de stockage de données". titi et toto correspondent bien à
des régions de stockages différentes, non ?


Bien sûr. Oui mais JMB dit que l'objet tableau est la suite des entiers
qu'il contient. Ci-dessus, toto et titi sont des tableaux de 5 éléments
chacun et qui contiennent les 5 mêmes entiers (à savoir que des 0). Bon,
je suppose que c'est la suite des 5 entiers telle qu'elle est placée en
mémoire.





Alors, finalement un tableau, ça n'existe pas !!!! ce qui existe c'est
un objet tableau, un identificateur de tableau et la valeur d'un
tableau. Ou je délire complètement ?


Tiens, on dirait que je t'ai contaminé avec mes questions
existentielles. :-))


Sûr et je suis en train de me demander ce que c'est que le C. Une
branche de la métaphysique ? ;)


Avatar
Francois
Sans rien y connaître, je dirais que d'après la définition que tu
donnes juste avant, titi et toto ne sont pas le même objet car un
objet "c'est une région de stockage de données". titi et toto
correspondent bien à des régions de stockages différentes, non ?


Bien sûr. Oui mais JMB dit que l'objet tableau est la suite des entiers
qu'il contient. Ci-dessus, toto et titi sont des tableaux de 5 éléments
chacun et qui contiennent les 5 mêmes entiers (à savoir que des 0). Bon,
je suppose que c'est la suite des 5 entiers telle qu'elle est placée en
mémoire.


Oui, je pense que c'est ça qu'il a voulu dire. Je pense qu'il a voulu
dire "toto = la zone de stockage des 5 entiers". Pas la même zone = pas
le même objet.


Tiens, on dirait que je t'ai contaminé avec mes questions
existentielles. :-))


Sûr et je suis en train de me demander ce que c'est que le C. Une
branche de la métaphysique ? ;)


Je crois que la difficulté, c'est la terminologie.

Moi, je viens de comprendre (grâce à toi) ce qu'est un objet (région de
stockage de donnée, "emplacement de mémoire" dans le K&R2 version
française en A4). Mais par exemple "expression", "expression tableau",
"variable tableau" etc. c'est pas clair encore.

Quand je regarde l'annexe A du K&R2, il y a beaucoup de références du
genre "voir plus loin" et peu d'exemples.


François


Avatar
Eric Levenez
Le 15/03/08 21:40, dans <47dc3437$0$20522$,
« candide » a écrit :

OK, je crois que je n'avais pas perçu le degré de liberté que possède le
compilateur.
Il me semble même que le compilateur peut ne pas générer le code d'une
fonction qui ne fait rien.


Je ne pense pas que le C implique l'utilisation d'un compilateur. Un
interpréteur pourrait aussi être utilisé.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
candide
Le 15/03/08 21:40, dans <47dc3437$0$20522$,

OK, je crois que je n'avais pas perçu le degré de liberté que possède le
compilateur.
Il me semble même que le compilateur peut ne pas générer le code d'une
fonction qui ne fait rien.


Je ne pense pas que le C implique l'utilisation d'un compilateur. Un
interpréteur pourrait aussi être utilisé.

Tu as raison, d'ailleurs, ça m'amuserait juste pour voir d'utiliser un

interpréteur C, si quelqu'un connait un defacilement utilisable ... En
réalité, ma dernière remarque fait référence à un passage de la norme me
semble-t-il (je ne sais plus où exactement) et donc pour être plus
neutre que compilateur ou interpréteur, on pourrait se référer à
"traducteur" :


---------------------------------------
An implementation translates C source files and (...)
---------------------------------------


Avatar
Pierre Maurette

[...]

difficulté pour moi, pauvre programmeur du dimanche


[...]

Il est possible que je sois passé à côté de quelque chose, je ne suis qu'un
programmeur du dimanche


[...]

Et au lieu de faire de la polémique stérile, si tu nous répondais à la
question de François, ce que moi, programmeur du dimanche,


C'est votre jour. Au boulot...

--
Pierre Maurette

Avatar
Jean-Marc Bourguet
candide writes:

candide writes:

int toto[5];

réserve de l'espace pour 5 entiers mais qu'elle n'entraîne pas de
réservation d'espace pour toto lui-même bien que l'objet toto existe,
L'objet toto ce sont ces 5 entiers.

[...]


Ce qui me gêne, c'est que dans


int toto[5]={0};
int titi[5]={0};

titi et toto seraient donc le même objet alors qu'ils représentent des
zones de stockage différentes.


Oops, j'aurais dû écrire,

L'objet toto c'est l'espace reservé pour ces 5 entiers.


Quelque part ailleur, tu as écrit:

D'accord mais alors comment l'implémentation fait-elle pour convertir
implicitement un tableau en pointeur, faut bien qu'elle trouve l'adresse
quelque part ?


Comment l'implémentation fait-elle pour accéder au contenu d'une variable
int, il faut bien qu'elle trouve l'adresse quelque part?

Dans les deux cas, l'implémentation trouve l'adresse au même endroit.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Francois writes:

L'esprit de la règle c'est "Dans les contextes qui ne peuvent pas prendre
un tableau, celui-ci est converti implicitement en un pointeur vers son
premier élément. Il y a deux contextes qui admettent un argument tableau:
sizeof et &."


Et bien, ceci me convient bien. J'avais l'impression que c'est ce que je
voulais dire. Sans doute l'ai-je mal dit, tout ça n'est peut-être qu'une
histoire de formulation?

Une seule petite chose me gêne, c'est dit comme ça on a l'impression que
l'on pourrait mettre "tab" (où on a "int tab[10]) à gauche du symbole
"=", comme on peut le faire pour un pointeur.


On ne peut pas le faire avec un pointeur.

int *f();

f() = NULL;

n'est pas valide. Le pointeur résultant de la conversion implicite est une
valeur, pas un objet.


tu ne peux pas faire cela pas plus que tu ne peux faire &tab[0] = &tab[0]
+ 1 ou x+1 = x+3.
Là aussi, j'ai l'impression (peut-être à tort) que vous chercher à

rectifier une erreur de ma part.
Tu donnes l'impression de croire qu'il y a quelque chose de particulier

pour les variables de type tableau (voir le sujet du fil). Il y a quelque
chose de particulier pour les expressions de type tableau (la plupart du
temps elles se prennent une conversion implicite dans les pattes), mais
rien de plus pour les variables.


Ah, il est possible que je donne cette impression car je ne sais pas du
tout ce qu'est "variable de type tableau" et "expression de type
tableau". Serait-ce trop demander que d'avoir un exemple. Là je suis perdu
et rattrapé par mon manque de vocabulaire. Allez, je tente quelque chose :

Avec "int tab[10] ;"
- "variable de type tableau" ---> tab[2]
- "expression de type tableau" ---> tab

Est-ce juste ?


Non.
tab est le nom d'une variable de type tableau de 10 int.
le nom d'une variable d'un type donné est aussi une expression du
même type, donc tab est aussi une expression de type tableau de 10 int.

tab[2] est une expression de type int.
la manière dont cette expression est analysée est la suivante:
tab est une expression de type tableau de 10 int, elle n'est pas
dans un contexte ou les expressions de type tableau sont valides,
donc il y a une conversion implicite vers un pointeur vers int.
Ce pointeur est le premier argument de [], le deuxième argument
étant 2.

Il y a trois choses qu'il ne faut pas confondre, mais malheureusement on a
tendance à utiliser les mêmes mots. Ca ne pose en pratique peu de
problèmes une fois qu'on a compris qu'il pouvait y avoir plusieurs choses.

Si je dis "int" ou "tableau" ou "pointeur", je parle de types (ou de
famille de types dans le cas de tableau et de pointeur).

Si je dis "j'ai un int", je parle soit d'une valeur de type "int" -- par
exemple 42 -- ou d'un objet de type "int", un endroit qui est capable de
mémoriser une valeur de ce type (et les variables sont simplement des
objets qui ont un nom).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Jean-Marc Bourguet
Erwan David writes:

Jean-Marc Bourguet écrivait :


Oops, j'aurais dû écrire,

L'objet toto c'est l'espace reservé pour ces 5 entiers.



l'objet n'a d'existence que dans le cadre de la machine abstraite qui
défini le langage. Les 5 cases mémoires ne sont qu'une implémentation de
cet objet par l'implémentation de C utilisée.


Pour quel objet est-ce que cette remarque n'est pas valable?

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2 3 4 5