Article View: fr.comp.lang.c
Article #14995Re: Insérer une fonctions dans une structure?
From: Pierre Maurette
Date: Wed, 19 Oct 2005 04:41
Date: Wed, 19 Oct 2005 04:41
72 lines
3919 bytes
3919 bytes
(supersedes <mn.998f7d5aeed9c8ce.31483@laposte.net>)
Nicolas Cherel, le 18/10/2005, a �crit :
> Pierre Maurette wrote:
[...]
>> int carre(int i) {return i * i;}
>> int cube(int i) {return i * i * i;}
>>
>> enum {ONE = 10, TWO};
>>
>> Complex table[] = {
>> ONE, &cube, "premier message",
>> TWO, &carre, "deuxi�me message",
>> };
[...]
> En passant, pour les pointeurs de fonction : quelle est la diff�rence entre
> "&fonction" et "fonction" ?. Un pointeur sur fonction peut �tre allou� avec
> l'un ou l'autre, sans influence sur le r�sultat.
> Si vous pouvez m'�clairer ...
Si "fonction" est le nom d'une fonction - 'function designator' - ,
c'est �quivalent effectivement. N�anmoins, il y a un pied jacon, et mon
code n'est peut-�tre pas "bon", bien que techniquement correct.
cube, comme printf, est de type 'fonction retournant un int'. Dans tous
les cas sauf avec les op�rateurs sizeof et &, il est converti vers le
type 'pointeur vers fonction retournant un int'. L'op�rateur & fait son
boulot normal. Pour faire simple et en n�gligeant sizeof, cube, ou
printf, et &cube, ou &printf, sont toujours remplac�s par &cube ou
&printf.
Maintenant, imaginons que je modifie mon code, parce que je viens de me
rendre compte que j'ai un
int cucube(int);
en biblioth�que. �conome, je vais jeter ma fonction cube() et faire:
int (*cube)() = cucube;
Et crack !
cube est de type 'pointeur vers fonction retournant un int', et non pas
'fonction retournant un int'. Donc, &cube est de type 'pointeur vers
pointeur vers fonction retournant un int', en fait c'est simplement et
logiquement l'adresse de ma variable cube, donc boum. Enfin, il y aura
au moins un warning, quand m�me.
Je n'aurais pas eu de probl�me si j'avais cod�:
Complex table[] = {
ONE, cube, "premier message",
TWO, carre, "deuxi�me message",
};
Code pour faire mumuse par les jours pluvieux que nous vivons:
int cube(char i) {return i * i * i;}
typedef int(*TFonctRetourneInt)();
TFonctRetourneInt fn1 = NULL, fn2 = NULL, fn3 = NULL, fn4 = NULL;
fn1 = printf;
fn2 = &printf;
fn3 = fn2;
fn4 = &fn2;/* caca, warning */
fn1("%p\t%p\t%p\n", cube, &cube, *cube);
fn2("%p\t%p\t%p\n", printf, &printf, *printf);
(*fn1)("%p\t%p\t%p\n", fn2, &fn2, *fn2);
printf("%p\t%p\t%p\n", fn3, &fn3, *fn3);
(*printf)("%p\t%p\t%p\n", fn4, &fn4, *fn4);
/* printf("%lu\n", sizeof cube); */
printf("%lu\n", sizeof &cube);
--
Pierre Maurette
Technical Details
Message-ID:
<mn.99917d5ad2c8c2d3.31483@laposte.net>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!infeed-2.proxad.net!news1-e.free.fr!not-for-mailReferences:
<87r7amd6qx.fsf@venus.net> <mn.7ccf7d5a1b906ca4.31483@laposte.net> <43556096$0$7337$636a55ce@news.free.fr>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,d00d98e8032f6fc
X-Google-Attributes: gidf9822,public
X-Google-Language: FRENCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!infeed-2.proxad.net!news1-e.free.fr!not-for-mail
Subject: Re: Insérer une fonctions dans une structure?
From: "Pierre Maurette" <maurettepierre@wanadoo.fr>
References: <87r7amd6qx.fsf@venus.net> <mn.7ccf7d5a1b906ca4.31483@laposte.net> <43556096$0$7337$636a55ce@news.free.fr>
Newsgroups: fr.comp.lang.c
Message-ID: <mn.99917d5ad2c8c2d3.31483@laposte.net>
Supersedes: <mn.998f7d5aeed9c8ce.31483@laposte.net>
X-Newsreader: MesNews/1.04.00.00
Date: Wed, 19 Oct 2005 06:41:49 +0200
MIME-Version: 1.0
X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}<qH-?#_Y$B9]$q1"~iUGtN#HVy?}7.`m&iKF>gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~
Reply-To: maurettepierre@wanadoo.fr
Content-Type: text/plain; charset="iso-8859-15"; format=flowed
Content-Transfer-Encoding: 8bit
X-Antivirus: avast! (VPS 0542-1, 18/10/2005), Outbound message
X-Antivirus-Status: Clean
Lines: 74
Organization: Guest of ProXad - France
NNTP-Posting-Date: 19 Oct 2005 06:39:59 MEST
NNTP-Posting-Host: 84.7.239.61
X-Trace: 1129696799 news1-e.free.fr 18715 84.7.239.61:3064
X-Complaints-To: abuse@proxad.net