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

Légallité d'un pointeur de tableaux

44 réponses
Avatar
Stéphane Zuckerman
Bonjour,

Je m'interroge sur une construction peu orthodoxe que je dois utiliser
en C (=E0 savoir un pointeur de tableaux).

J'ai une fonction dont le prototype est =E0 peu pr=E8s le suivant :

void f(float (*tab)[N], /* reste des arguments */);

Jusque l=E0, tout va bien. Dans le main(), j'alloue "tab" =E0 l'aide des
lignes suivantes :

#define M ...
#define N ...

int main(void)
{
/* d=E9clarations ... */
float (*t)[N];

t =3D malloc(sizeof(float) * M * N);
if (t =3D=3D NULL) { /* gestion d'erreur */ }

/* ... */
f(t, ...);

return 0;
}

J'ai cherch=E9 un peu partout, demand=E9 =E0 des personnes qui =E0 ma
connaissance connaissent bien la norme, et ce code semble l=E9gal.
J'aimerais d'une part avoir confirmation, et d'autre part savoir si
quelqu'un pourrait me dire o=F9 dans la norme je peux confirmer cela.

Merci d'avance ! :-)

--
St=E9phane Zuckerman

4 réponses

1 2 3 4 5
Avatar
Alexandre Bacquart
Jean-Claude Arbaut wrote:
Alexandre Bacquart wrote:
Jean-Claude Arbaut wrote:

Tiens, pour me simplifier la vie j'utilisais ça :

#define new(n,t) ((t *)calloc(n, sizeof(t)))



Comme quoi, il y a des claques qui se perdent !



Ce n'est pas illégal :o)



Qui a parlé de légalité ? Quand on fait quelque-chose d'illégal, on ne
se prend pas une claque, juste un message d'erreur. Vive l'illégalité !


--
Alex
Avatar
Antoine Leca
Le 04/06/2009 6:52, Cellophane Zuckerman écrivit :
Les tableaux « multidimensionnels » à N dimensions, même
déclarés avec toutes leurs dimensions, sont vus par le compilateur
comme un pointeur vers des tableaux à N-1 dimensions, si je ne me
trompe pas :

void f(type (*t)[N][K]); <=> void f(type t[M][N][K]);



C'est vrai *uniquement* dans les déclarations de paramètres. En fait ce
qui se passe c'est que le compilateur remplace (à tous les effets) la
seconde forme par la première, et donc dans toute la fonction t sera un
pointeur vers une « matrice » (tableau à deux dimensions) de «type».
Le [M] (tant que M est une constante) est purement du sucre syntaxique,
une sorte de commentaire, pour indiquer au lecteur que la fonction est
conçue pour manipuler un tableau de cette taille.

Dans les autres déclarations (statiques, globales, auto, pointeurs),
cette réduction n'existe pas.


Antoine
Avatar
Stéphane Zuckerman
On Jun 4, 9:01 pm, Antoine Leca wrote:
Le 04/06/2009 6:52, Cellophane Zuckerman écrivit :


« Cellophane » ? Mmmh.

> Les tableaux « multidimensionnels » à N dimensions, même
> déclarés avec toutes leurs dimensions, sont vus par le compilateur
> comme un pointeur vers des tableaux à N-1 dimensions, si je ne me
> trompe pas :

> void f(type (*t)[N][K]); <=> void f(type t[M][N][K]);

C'est vrai *uniquement* dans les déclarations de paramètres. En fait ce



Oui, je me suis mal exprimé, c'est ce que j'ai maladroitement voulu
faire passer (en oubliant les cas statiques et globaux) en disant :
« À ma connaissance, à moins d'avoir déclaré le tableau en débu t de
fonction, et donc de l'avoir alloué sur la pile [...] ». Je pensais
uniquement à « mon » contexte d'utilisation (celui où effectiveme nt,
je dois passer mon tableau à une fonction, avec la « perte » de la
première dimension qui s'en suit ...).

Stéphane
Avatar
Antoine Leca
[ Xpost + suivi repositionné ]

Le 17/06/2009 13:49Z, Stéphane Zuckerman écrivit dans
<news:
en répondant à <news:h095mb$dsi$:
On Jun 4, 9:01 pm, Antoine Leca wrote:
Le 04/06/2009 6:52, Cellophane Zuckerman écrivit :


« Cellophane » ? Mmmh.



Excellent !

Évidemment je n'ai pas réussi à le faire exprès, c'est une facétie de
Thunderbird et des dictionnaires de correction orthographique... On
dirait que le dico n'a pas apprécié Stéphane et a préféré Cellophane !

Bon, comme en plus on dirait que le dico français ne connaît pas
Stéphane (?), je l'ai rajouté au dictionnaire perso et je fais suivre ce
bout de fil dans un forum (un peu) plus adapté, des fois que les
personnes qui nous lisent peuvent avoir une influence sur la qualité des
dictionnaires.


Antoine
1 2 3 4 5