Tu dois donc écrire device* (*fct)();
En fait, tu as déja tout compris et je ne vois pas vraiment ton
problème...
Tu dois donc écrire device* (*fct)();
En fait, tu as déja tout compris et je ne vois pas vraiment ton
problème...
Tu dois donc écrire device* (*fct)();
En fait, tu as déja tout compris et je ne vois pas vraiment ton
problème...
typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
}pointeurs;
avec device défini ainsi :
typedef struct{
char cdrom[3];
char path[15];
}device;
ensuite, je fais :
pointeurs tab_fct[4];
tab_fct[0].fct_handle=opendevice;
tab_fct[1].fct_void=EjectVolume;
tab_fct[2].fct_void=load;
tab_fct[3].fct_device=Get_Drives;
là ça compile bien, sauf que.... pour la ligne :
tab_fct[3].fct_device=Get_Drives;
j'ai le warning :
[Warning] assignment from incompatible pointer type
je sais pourquoi, mais ne sais pas trop comment résoudre ce problème....
Il suffit de rajouter l'*' qui va bien.
en fait Get_Drives ne retourne pas une structure de type device, mais un
pointeur sur une structure de type device...
donc je pense que l'erreur vient du fait que j'ai mal défini mon
pointeur de fonction...
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
}pointeurs;
avec device défini ainsi :
typedef struct{
char cdrom[3];
char path[15];
}device;
ensuite, je fais :
pointeurs tab_fct[4];
tab_fct[0].fct_handle=opendevice;
tab_fct[1].fct_void=EjectVolume;
tab_fct[2].fct_void=load;
tab_fct[3].fct_device=Get_Drives;
là ça compile bien, sauf que.... pour la ligne :
tab_fct[3].fct_device=Get_Drives;
j'ai le warning :
[Warning] assignment from incompatible pointer type
je sais pourquoi, mais ne sais pas trop comment résoudre ce problème....
Il suffit de rajouter l'*' qui va bien.
en fait Get_Drives ne retourne pas une structure de type device, mais un
pointeur sur une structure de type device...
donc je pense que l'erreur vient du fait que j'ai mal défini mon
pointeur de fonction...
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
}pointeurs;
avec device défini ainsi :
typedef struct{
char cdrom[3];
char path[15];
}device;
ensuite, je fais :
pointeurs tab_fct[4];
tab_fct[0].fct_handle=opendevice;
tab_fct[1].fct_void=EjectVolume;
tab_fct[2].fct_void=load;
tab_fct[3].fct_device=Get_Drives;
là ça compile bien, sauf que.... pour la ligne :
tab_fct[3].fct_device=Get_Drives;
j'ai le warning :
[Warning] assignment from incompatible pointer type
je sais pourquoi, mais ne sais pas trop comment résoudre ce problème....
Il suffit de rajouter l'*' qui va bien.
en fait Get_Drives ne retourne pas une structure de type device, mais un
pointeur sur une structure de type device...
donc je pense que l'erreur vient du fait que j'ai mal défini mon
pointeur de fonction...
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
... surtout une grosse comme ça...
In 'fr.comp.lang.c', "Nicolas aunai" <nicolas.aunai@nospam@free.fr> wrote:
typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
... surtout une grosse comme ça...
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
... surtout une grosse comme ça...
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
bon, j'aif ait un truc qui marche, mais c'est un peu de la chance :
device *(*fct_device)();
qqn peut-il m'expliquer cette notation un peu compliquée ?
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
Quand une fonction renvoie une valeur, il y a recopie de la valeur
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
Quand une fonction renvoie une valeur, il y a recopie de la valeur
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
Quand une fonction renvoie une valeur, il y a recopie de la valeur
Lors de l'appel d'une fonction, le contexte de la fonction est sauvée,
(ce qui est dans la pile est copié en mémoire) et les paramètres de la
fonction sont copiés systématiquement dans la pile. (c'est pour ce la
qu'on dit qu'on travaille sur des copies locales). On travaille ensuite
avec ces paramètres.
Pour faire
ensuite une opération avec une valeur à l'intérieur de la structure, il
faut la charger dans le registre. Si on peut la charger depuis la
mémoire directement (et pas depuis la pile), ça économise une copie.
D'aucun argumenteront que le chargement depuis la pile doit être plus
rapide : Mais dans le cas de gros chargement, la différence doit être
négligeable par rapport à l'économie d'une copie...
Je ne sais pas si je suis assez clair, mais je pense que c'est comme ça
que ça fonctionne.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Lors de l'appel d'une fonction, le contexte de la fonction est sauvée,
(ce qui est dans la pile est copié en mémoire) et les paramètres de la
fonction sont copiés systématiquement dans la pile. (c'est pour ce la
qu'on dit qu'on travaille sur des copies locales). On travaille ensuite
avec ces paramètres.
Pour faire
ensuite une opération avec une valeur à l'intérieur de la structure, il
faut la charger dans le registre. Si on peut la charger depuis la
mémoire directement (et pas depuis la pile), ça économise une copie.
D'aucun argumenteront que le chargement depuis la pile doit être plus
rapide : Mais dans le cas de gros chargement, la différence doit être
négligeable par rapport à l'économie d'une copie...
Je ne sais pas si je suis assez clair, mais je pense que c'est comme ça
que ça fonctionne.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Lors de l'appel d'une fonction, le contexte de la fonction est sauvée,
(ce qui est dans la pile est copié en mémoire) et les paramètres de la
fonction sont copiés systématiquement dans la pile. (c'est pour ce la
qu'on dit qu'on travaille sur des copies locales). On travaille ensuite
avec ces paramètres.
Pour faire
ensuite une opération avec une valeur à l'intérieur de la structure, il
faut la charger dans le registre. Si on peut la charger depuis la
mémoire directement (et pas depuis la pile), ça économise une copie.
D'aucun argumenteront que le chargement depuis la pile doit être plus
rapide : Mais dans le cas de gros chargement, la différence doit être
négligeable par rapport à l'économie d'une copie...
Je ne sais pas si je suis assez clair, mais je pense que c'est comme ça
que ça fonctionne.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit. Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
Oui, c'est flou. Mais ton approche "sémantique d'abord, puis
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
certes.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit. Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
Oui, c'est flou. Mais ton approche "sémantique d'abord, puis
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
certes.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit. Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
Oui, c'est flou. Mais ton approche "sémantique d'abord, puis
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
certes.
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur)
Je pense que c'est discutable à ton niveau.
Se pose la question de "qui doit libérer la mémoire" ?
Dans ce cas là, il faut le préciser, c'est vrai, et c'est source d'oublis.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
Certes, mais c'est pas pour rien qu'on a inventé le mot clef inline (qui
n'existe pas en C): c'est pour dire si l'appelle de fonction est un
mécanisme qui peut faire perdre du temps.
In article , AG wrote:Quand une fonction renvoie une valeur, il y a recopie de la valeur
quelque part (dans la pile je pense) au moment ou on sort de la
fonction.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit.
Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
C'est pour
cela qu'on préfère passer des pointeurs sur les structures plutot que
les structures elles-même, et de la même manière, on préfère renvoyer un
pointeur sur une structure plutôt que la structure elle même, même si
c'est faisable.
Mais ça m'étonne que tu poses la question.
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur).
Se pose la question de "qui doit libérer la mémoire" ?
Autant je veux bien conseiller le passage de paramêtre par
pointeur, autant pour le retour de fonction...
Pour ma part, je préfère réfléchir en terme de sémantique,
puis optimiser après mesure du code.
In article <3F041F1F.6080801@tb.fr>, AG wrote:
Quand une fonction renvoie une valeur, il y a recopie de la valeur
quelque part (dans la pile je pense) au moment ou on sort de la
fonction.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit.
Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
C'est pour
cela qu'on préfère passer des pointeurs sur les structures plutot que
les structures elles-même, et de la même manière, on préfère renvoyer un
pointeur sur une structure plutôt que la structure elle même, même si
c'est faisable.
Mais ça m'étonne que tu poses la question.
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur).
Se pose la question de "qui doit libérer la mémoire" ?
Autant je veux bien conseiller le passage de paramêtre par
pointeur, autant pour le retour de fonction...
Pour ma part, je préfère réfléchir en terme de sémantique,
puis optimiser après mesure du code.
In article , AG wrote:Quand une fonction renvoie une valeur, il y a recopie de la valeur
quelque part (dans la pile je pense) au moment ou on sort de la
fonction.
Oui, mais de toute façon, la copie doit avoir lieu à un moment
ou un autre, non ? Il faut recopier le résultat calculé à l'endroit
ou on veut qu'il soit.
Sans compter qu'avec les mécanismes
de cache, on peut vouloir préférer travailler avec la pile
(espace contigue en mémoire, facilement dans le cache) qu'avec
de la mémoire éparpillée partout.
Et puis bon, les compilateurs savent souvent assez
bien supprimer les copies mémoires inutiles.
Si la valeur est une structure, grosse qui plus est, le
mécanisme devient lourd (les recopies prennent du temps).
C'est quoi une "grosse" structure ?
C'est pour
cela qu'on préfère passer des pointeurs sur les structures plutot que
les structures elles-même, et de la même manière, on préfère renvoyer un
pointeur sur une structure plutôt que la structure elle même, même si
c'est faisable.
Mais ça m'étonne que tu poses la question.
Peut-être parce que je n'aime pas trop les règles de programmation
simpliste "on ne retourne pas une structure".
L'introduction de pointeur est une source d'erreur (oui, je sais,
les bons programmeurs ne font pas d'erreur de manipulation
de pointeur).
Se pose la question de "qui doit libérer la mémoire" ?
Autant je veux bien conseiller le passage de paramêtre par
pointeur, autant pour le retour de fonction...
Pour ma part, je préfère réfléchir en terme de sémantique,
puis optimiser après mesure du code.
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
... surtout une grosse comme ça...
En quoi est-ce pire qu'une autre version ?
In 'fr.comp.lang.c', "Nicolas aunai" <nicolas.aunai@nospam@free.fr> wrote:
typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
... surtout une grosse comme ça...
En quoi est-ce pire qu'une autre version ?
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:typedef union pointeurs{
HANDLE (*fct_handle)();//oui je c, pas standard...
void (*fct_void)();
device (*fct_device)();
Ca m'étonnerait qu'une fonction retourne une structure ...
Heuh, pourquoi ?
C'est mal ?
... surtout une grosse comme ça...
En quoi est-ce pire qu'une autre version ?