1) Si je déclare
int table[3][4];
table est de type int(*)[4],
et table[i] est de type int[4].
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
1) Si je déclare
int table[3][4];
table est de type int(*)[4],
et table[i] est de type int[4].
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
1) Si je déclare
int table[3][4];
table est de type int(*)[4],
et table[i] est de type int[4].
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
> 1) Si je déclare
> int table[3][4];
> Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
> et que le
> compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
> puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
> dimensions sauf la première soient connues à la compilation.)
C'est confus parce que tu mélanges pointeurs et tableaux, mais c'est à
peu près cela.
> 1) Si je déclare
> int table[3][4];
> Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
> et que le
> compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
> puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
> dimensions sauf la première soient connues à la compilation.)
C'est confus parce que tu mélanges pointeurs et tableaux, mais c'est à
peu près cela.
> 1) Si je déclare
> int table[3][4];
> Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
> et que le
> compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
> puis remplacera table[i] par t+4*i ? (D'où l'obligation que toutes les
> dimensions sauf la première soient connues à la compilation.)
C'est confus parce que tu mélanges pointeurs et tableaux, mais c'est à
peu près cela.
Le 10 juin 2009, Antoine Leca a écrit :1) Si je déclare
int table[3][4];
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Je sais que table[i] est l'adresse d'une zone mémoire allouée,
c'est celle de la valeur table[i][0].
Ce que je demande, c'est si la valeur table[i] est
stockée quelque part en mémoire.
int table[3][4];
le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
table[1] et table[2] ?
lorsque je les utilise, à partir de table, i et 4, selon la formule
table+4*i. J'ai bon ?
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
Tous les types du C existent-ils ?
Le 10 juin 2009, Antoine Leca a écrit :
1) Si je déclare
int table[3][4];
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Je sais que table[i] est l'adresse d'une zone mémoire allouée,
c'est celle de la valeur table[i][0].
Ce que je demande, c'est si la valeur table[i] est
stockée quelque part en mémoire.
int table[3][4];
le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
table[1] et table[2] ?
lorsque je les utilise, à partir de table, i et 4, selon la formule
table+4*i. J'ai bon ?
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
Tous les types du C existent-ils ?
Le 10 juin 2009, Antoine Leca a écrit :1) Si je déclare
int table[3][4];
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire,
Oui si i==3; non dans tous les autres cas : l'objet existe pour i valant
0,1 et 2, et l'expression n'a pas de sens pour les autres valeurs de i.
Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Je sais que table[i] est l'adresse d'une zone mémoire allouée,
c'est celle de la valeur table[i][0].
Ce que je demande, c'est si la valeur table[i] est
stockée quelque part en mémoire.
int table[3][4];
le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
table[1] et table[2] ?
lorsque je les utilise, à partir de table, i et 4, selon la formule
table+4*i. J'ai bon ?
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
Tous les types du C existent-ils ?
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire, et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ?
(D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire, et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ?
(D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Confirmez-vous que néanmoins table[i] n'existe pas en mémoire, et que le
compilateur ne crée qu'un genre de int *t qui pointe vers table[0][0],
puis remplacera table[i] par t+4*i ?
(D'où l'obligation que toutes les
dimensions sauf la première soient connues à la compilation.)
Du coup, je n'ai aucun intérêt à déclarer
int table[3*4];
puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
xycc -S > tes_yeuxTous les types du C existent-ils ?
Où ?
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Relis aussi ce que j'ai écrit au début : en C les types sont
essentiellement un truc du compilateur, il n'y en quasiment plus de
trace dans le binaire produit.
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
xycc -S > tes_yeux
Tous les types du C existent-ils ?
Où ?
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Relis aussi ce que j'ai écrit au début : en C les types sont
essentiellement un truc du compilateur, il n'y en quasiment plus de
trace dans le binaire produit.
Par exemple, que verrait-on si on lisait le code assembleur
produit par le compilo ?
xycc -S > tes_yeuxTous les types du C existent-ils ?
Où ?
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Relis aussi ce que j'ai écrit au début : en C les types sont
essentiellement un truc du compilateur, il n'y en quasiment plus de
trace dans le binaire produit.
comment les types du C (de base,
ou pas) sont interprétés dans le code assembleur (qui lui ne reconnait pas
forcément les même types).
En tous cas, je sais que je me suis posé ce genre de
question ou approchant, par exemple comment une bibliothèque qui n'a pas été
écrite en C peut dialoguer avec du code C, en particulier au moment de l'édition
de liens, plus précisément comment du code C peut appeler une fonction (donc
avec une syntaxe C) "externe" dans une bibliothèque par exemple qui elle a été
écrite dans un tout autre langage.
comment les types du C (de base,
ou pas) sont interprétés dans le code assembleur (qui lui ne reconnait pas
forcément les même types).
En tous cas, je sais que je me suis posé ce genre de
question ou approchant, par exemple comment une bibliothèque qui n'a pas été
écrite en C peut dialoguer avec du code C, en particulier au moment de l'édition
de liens, plus précisément comment du code C peut appeler une fonction (donc
avec une syntaxe C) "externe" dans une bibliothèque par exemple qui elle a été
écrite dans un tout autre langage.
comment les types du C (de base,
ou pas) sont interprétés dans le code assembleur (qui lui ne reconnait pas
forcément les même types).
En tous cas, je sais que je me suis posé ce genre de
question ou approchant, par exemple comment une bibliothèque qui n'a pas été
écrite en C peut dialoguer avec du code C, en particulier au moment de l'édition
de liens, plus précisément comment du code C peut appeler une fonction (donc
avec une syntaxe C) "externe" dans une bibliothèque par exemple qui elle a été
écrite dans un tout autre langage.
Le 11/06/2009 08:14Z, Lucas Levrel écrivit :
> Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Personnellement je ne vois aucune ambiguïté.
Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
possède son adresse propre.
> Je sais que table[i] est l'adresse d'une zone mémoire allouée,
> c'est celle de la valeur table[i][0].
Pour la n-ième fois, je ne comprends pas ta notation.
> le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
> table[1] et table[2] ?
Il réserve une seule zone de 12 int. On peut ensuite voir cela comme
trois zones, mais il n'en reste pas moins que les zones sont contiguës.
> Je crois que non, qu'il les calcule uniquement
> lorsque je les utilise, à partir de table, i et 4, selon la formule
> table+4*i. J'ai bon ?
Pas tout-à-fait (dans le cas général) : quand le compilateur est au
niveau des adresses, il n'a que faire des limites des int et s'intéresse
normalement aux adresses des objets, qui sont d'habitude celles des bytes.
Donc la formule devient table+sizeof(int)*4*i
Mais bon, cela c'est la salade interne des compilateurs, ce n'est pas
important.
> Par exemple, que verrait-on si on lisait le code assembleur
> produit par le compilo ?
xycc -S > tes_yeux
> Tous les types du C existent-ils ?
Où ?
Que veut dire « tous » ?
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Le 11/06/2009 08:14Z, Lucas Levrel écrivit :
> Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Personnellement je ne vois aucune ambiguïté.
Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
possède son adresse propre.
> Je sais que table[i] est l'adresse d'une zone mémoire allouée,
> c'est celle de la valeur table[i][0].
Pour la n-ième fois, je ne comprends pas ta notation.
> le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
> table[1] et table[2] ?
Il réserve une seule zone de 12 int. On peut ensuite voir cela comme
trois zones, mais il n'en reste pas moins que les zones sont contiguës.
> Je crois que non, qu'il les calcule uniquement
> lorsque je les utilise, à partir de table, i et 4, selon la formule
> table+4*i. J'ai bon ?
Pas tout-à-fait (dans le cas général) : quand le compilateur est au
niveau des adresses, il n'a que faire des limites des int et s'intéresse
normalement aux adresses des objets, qui sont d'habitude celles des bytes.
Donc la formule devient table+sizeof(int)*4*i
Mais bon, cela c'est la salade interne des compilateurs, ce n'est pas
important.
> Par exemple, que verrait-on si on lisait le code assembleur
> produit par le compilo ?
xycc -S > tes_yeux
> Tous les types du C existent-ils ?
Où ?
Que veut dire « tous » ?
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Le 11/06/2009 08:14Z, Lucas Levrel écrivit :
> Ah, l'ambiguïté entre valeur et adresse d'un pointeur...
Personnellement je ne vois aucune ambiguïté.
Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
possède son adresse propre.
> Je sais que table[i] est l'adresse d'une zone mémoire allouée,
> c'est celle de la valeur table[i][0].
Pour la n-ième fois, je ne comprends pas ta notation.
> le compilateur réserve-t-il trois zones de mémoire pour stocker table[0],
> table[1] et table[2] ?
Il réserve une seule zone de 12 int. On peut ensuite voir cela comme
trois zones, mais il n'en reste pas moins que les zones sont contiguës.
> Je crois que non, qu'il les calcule uniquement
> lorsque je les utilise, à partir de table, i et 4, selon la formule
> table+4*i. J'ai bon ?
Pas tout-à-fait (dans le cas général) : quand le compilateur est au
niveau des adresses, il n'a que faire des limites des int et s'intéresse
normalement aux adresses des objets, qui sont d'habitude celles des bytes.
Donc la formule devient table+sizeof(int)*4*i
Mais bon, cela c'est la salade interne des compilateurs, ce n'est pas
important.
> Par exemple, que verrait-on si on lisait le code assembleur
> produit par le compilo ?
xycc -S > tes_yeux
> Tous les types du C existent-ils ?
Où ?
Que veut dire « tous » ?
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
EXAMPLE Consider the array object defined by the declaration int
x[3][5]; Here x is a 3 × 5 array of ints; more precisely, x is an array
of three element objects, each of which is an array of five ints. In the
expression x[i], which is equivalent to (*((x)+(i))), x is first
converted to a pointer to the initial array of five ints.
> Du coup, je n'ai aucun intérêt à déclarer
> int table[3*4];
> puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Intérêt ? ça dépend de ce que tu veux faire. Je trouve les tableaux
multidimensionnels (les vrais, par ceux qu'on alloue dynamiquement, cf.
ton point numéro2) peu souples puisqu'il faut indiquer toutes les
dimensions sauf la dimension principale lorsque le tableau est amené à
être argument d'une fonction.
En même temps, j'ai bien conscience que ce que je dis là n'est pas
exactement ta préoccupation, tu sembles visiblement vouloir comparer les
coûts respectifs effectués par différents type d'allocation de tableaux
EXAMPLE Consider the array object defined by the declaration int
x[3][5]; Here x is a 3 × 5 array of ints; more precisely, x is an array
of three element objects, each of which is an array of five ints. In the
expression x[i], which is equivalent to (*((x)+(i))), x is first
converted to a pointer to the initial array of five ints.
> Du coup, je n'ai aucun intérêt à déclarer
> int table[3*4];
> puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Intérêt ? ça dépend de ce que tu veux faire. Je trouve les tableaux
multidimensionnels (les vrais, par ceux qu'on alloue dynamiquement, cf.
ton point numéro2) peu souples puisqu'il faut indiquer toutes les
dimensions sauf la dimension principale lorsque le tableau est amené à
être argument d'une fonction.
En même temps, j'ai bien conscience que ce que je dis là n'est pas
exactement ta préoccupation, tu sembles visiblement vouloir comparer les
coûts respectifs effectués par différents type d'allocation de tableaux
EXAMPLE Consider the array object defined by the declaration int
x[3][5]; Here x is a 3 × 5 array of ints; more precisely, x is an array
of three element objects, each of which is an array of five ints. In the
expression x[i], which is equivalent to (*((x)+(i))), x is first
converted to a pointer to the initial array of five ints.
> Du coup, je n'ai aucun intérêt à déclarer
> int table[3*4];
> puis à gérer moi-même l'accès à l'élément (i,j) avec table[4*i+j].
Intérêt ? ça dépend de ce que tu veux faire. Je trouve les tableaux
multidimensionnels (les vrais, par ceux qu'on alloue dynamiquement, cf.
ton point numéro2) peu souples puisqu'il faut indiquer toutes les
dimensions sauf la dimension principale lorsque le tableau est amené à
être argument d'une fonction.
En même temps, j'ai bien conscience que ce que je dis là n'est pas
exactement ta préoccupation, tu sembles visiblement vouloir comparer les
coûts respectifs effectués par différents type d'allocation de tableaux
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Y'a des chances, vu qu'on peut mettre autant de [n] qu'on veut avec n
entier strictement positif quelconque, ça fait un beau N^N !
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Y'a des chances, vu qu'on peut mettre autant de [n] qu'on veut avec n
entier strictement positif quelconque, ça fait un beau N^N !
Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Y'a des chances, vu qu'on peut mettre autant de [n] qu'on veut avec n
entier strictement positif quelconque, ça fait un beau N^N !
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).
Que veut dire « tous » ? Les types du C décrivent un ensemble infini
(peut-être même non dénombrable, mais cela fait trop longtemps que ce
sujet ne me préoccupe plus pour que je ne sois pas 100% sûr).