Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bien entendu, un typedef s'impose, et tout rentre dans l'ordre.
Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bien entendu, un typedef s'impose, et tout rentre dans l'ordre.
Bonjour,
Mon problème est peut-être plus C que C++, mais je le fais facilement
apparaître avec new[], et de plus c'est la réponse de la norme C++ qui
m'intéresse le plus.
Si on définit une variable pointeur de fonction :
int(*pF)(double, double) = NULL;
on a la facilité d'utiliser ou non, indifféremment, les opérateurrs * et & ,
ou plus exactement on a exceptionnellement la possibilité de les omettre :
int fonct(double x, double y) {return (int)(x * y);}
...
pF = &fonct;
pF = fonct;
...
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Bien entendu, un typedef s'impose, et tout rentre dans l'ordre.
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
[...]
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
A nouveau, pourquoi pas:
typedef int (*pointeurVersFonction)(double, double);
std::vector<pointeurVersFonction> monTableau;
Tests. Voir la réponse faite à Loïc.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Borland.
new (int(*)(double, double))[n];
S'interprète comme
(new (int(*)(double, double)))[n];
ce que tu veux c'est
new (int(*[n])(double, double));
Of course.
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
[...]
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
A nouveau, pourquoi pas:
typedef int (*pointeurVersFonction)(double, double);
std::vector<pointeurVersFonction> monTableau;
Tests. Voir la réponse faite à Loïc.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Borland.
new (int(*)(double, double))[n];
S'interprète comme
(new (int(*)(double, double)))[n];
ce que tu veux c'est
new (int(*[n])(double, double));
Of course.
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
[...]
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
A nouveau, pourquoi pas:
typedef int (*pointeurVersFonction)(double, double);
std::vector<pointeurVersFonction> monTableau;
Tests. Voir la réponse faite à Loïc.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Borland.
new (int(*)(double, double))[n];
S'interprète comme
(new (int(*)(double, double)))[n];
ce que tu veux c'est
new (int(*[n])(double, double));
Of course.
...
pF = &fonct;
pF = fonct;
Marche en vertue du 4.3 :
4.3 Functiontopointer conversion
1 An lvalue of function type T can be converted to an rvalue of type
"pointer to T." The result is a pointer to the function.50)x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
5.2.2 Function call
1 There are two kinds of function call: ordinary function call and
member function57) (9.3) call. A function
call is a postfix expression followed by parentheses containing a
possibly empty, commaseparated
list of
expressions which constitute the arguments to the function. For an
ordinary function call, the postfix
expression shall be either an lvalue that refers to a function (in which
case the functiontopointer
standard
conversion (4.3) is suppressed on the postfix expression), or it shall
have pointer to function type.
A noter que ce raccourci n'existe pas avec les fonctions membres.
Merci pour cette réponse rapide. Je dois être fatigué, c'était dans les
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Une question qui n'a rien à voir : Pourquoi n'initialises-tu pas à la
déclaration ?
Certes. En fait, c'est tout con, c'est pas du code, ce sont des tests. Des
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Ca, j'en sais rien, j'ai toujours fait un typedef sans chercher à
savoir...
...
pF = &fonct;
pF = fonct;
Marche en vertue du 4.3 :
4.3 Functiontopointer conversion
1 An lvalue of function type T can be converted to an rvalue of type
"pointer to T." The result is a pointer to the function.50)
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
5.2.2 Function call
1 There are two kinds of function call: ordinary function call and
member function57) (9.3) call. A function
call is a postfix expression followed by parentheses containing a
possibly empty, commaseparated
list of
expressions which constitute the arguments to the function. For an
ordinary function call, the postfix
expression shall be either an lvalue that refers to a function (in which
case the functiontopointer
standard
conversion (4.3) is suppressed on the postfix expression), or it shall
have pointer to function type.
A noter que ce raccourci n'existe pas avec les fonctions membres.
Merci pour cette réponse rapide. Je dois être fatigué, c'était dans les
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Une question qui n'a rien à voir : Pourquoi n'initialises-tu pas à la
déclaration ?
Certes. En fait, c'est tout con, c'est pas du code, ce sont des tests. Des
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Ca, j'en sais rien, j'ai toujours fait un typedef sans chercher à
savoir...
...
pF = &fonct;
pF = fonct;
Marche en vertue du 4.3 :
4.3 Functiontopointer conversion
1 An lvalue of function type T can be converted to an rvalue of type
"pointer to T." The result is a pointer to the function.50)x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0);
Question : qu'en dit la norme ? (pas pu trouver)
5.2.2 Function call
1 There are two kinds of function call: ordinary function call and
member function57) (9.3) call. A function
call is a postfix expression followed by parentheses containing a
possibly empty, commaseparated
list of
expressions which constitute the arguments to the function. For an
ordinary function call, the postfix
expression shall be either an lvalue that refers to a function (in which
case the functiontopointer
standard
conversion (4.3) is suppressed on the postfix expression), or it shall
have pointer to function type.
A noter que ce raccourci n'existe pas avec les fonctions membres.
Merci pour cette réponse rapide. Je dois être fatigué, c'était dans les
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Une question qui n'a rien à voir : Pourquoi n'initialises-tu pas à la
déclaration ?
Certes. En fait, c'est tout con, c'est pas du code, ce sont des tests. Des
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique
au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland,
c'est non., conversion de type impossible
Les Gnou interprètent pF en fonction de l'appel de malloc() ou de new[],
pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient pas
autorisées les facilités initiales, donc que le typedef s'impose de
lui-même.
Question : Qu'en dit la norme ? Qui a raison ?
Ca, j'en sais rien, j'ai toujours fait un typedef sans chercher à
savoir...
Pierre Maurette wrote:
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Pierre Maurette wrote:
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Pierre Maurette wrote:
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Passons au new[] :
pF = new (int(*)(double, double))[n];
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même type.
Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que j'étais
Passons au new[] :
pF = new (int(*)(double, double))[n];
Tu alloues *une* pointeur à une fonction, que tu déréférences
immédiatement au moyen de l'opérateur []. L'expression à droit se
parenthèse :
(new (int (*)( double, double )))[ n ]
L'expression est légale (syntactiquement, au moins), mais a le type int
(double, double) (c-à-d le type d'une fonction, et non un pointeur à
fonction). Il y a donc une différence de types entre la côté gauche et
la côté droite de l'affectation.
Sans doute ce que tu voulais faire, c'est :
pF = new int (*[n])( double, double ) ;
Mais je me démande bien pourquoi. Je ne vois aucun cas où j'utiliserais
new[] à la place de std::vector.La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Selon la norme, c'est Borland qui a raison. C'est une erreur ou une
extension (selon les points de vue) connue de g++.
Oui, oui. J'ai répondu au messge de Jean-Marc, et comme je n'ai pas de
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même type.
Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que j'étais
Passons au new[] :
pF = new (int(*)(double, double))[n];
Tu alloues *une* pointeur à une fonction, que tu déréférences
immédiatement au moyen de l'opérateur []. L'expression à droit se
parenthèse :
(new (int (*)( double, double )))[ n ]
L'expression est légale (syntactiquement, au moins), mais a le type int
(double, double) (c-à-d le type d'une fonction, et non un pointeur à
fonction). Il y a donc une différence de types entre la côté gauche et
la côté droite de l'affectation.
Sans doute ce que tu voulais faire, c'est :
pF = new int (*[n])( double, double ) ;
Mais je me démande bien pourquoi. Je ne vois aucun cas où j'utiliserais
new[] à la place de std::vector.
La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Selon la norme, c'est Borland qui a raison. C'est une erreur ou une
extension (selon les points de vue) connue de g++.
Oui, oui. J'ai répondu au messge de Jean-Marc, et comme je n'ai pas de
Si je désire un tableau de fonctions dont la taile sera déterminée à
l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là.
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double,
double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes, mais
logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même type.
Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que j'étais
Passons au new[] :
pF = new (int(*)(double, double))[n];
Tu alloues *une* pointeur à une fonction, que tu déréférences
immédiatement au moyen de l'opérateur []. L'expression à droit se
parenthèse :
(new (int (*)( double, double )))[ n ]
L'expression est légale (syntactiquement, au moins), mais a le type int
(double, double) (c-à-d le type d'une fonction, et non un pointeur à
fonction). Il y a donc une différence de types entre la côté gauche et
la côté droite de l'affectation.
Sans doute ce que tu voulais faire, c'est :
pF = new int (*[n])( double, double ) ;
Mais je me démande bien pourquoi. Je ne vois aucun cas où j'utiliserais
new[] à la place de std::vector.La famille du Gnou accepte, et le résultat est celui attendu. Chez
Borland, c'est non., conversion de type impossible Les Gnou
interprètent pF en fonction de l'appel de malloc() ou de new[], pas
Borland. Je ne suis pas contre, je préfèrerais même que ne soient
pas autorisées les facilités initiales, donc que le typedef s'impose
de lui-même. Question : Qu'en dit la norme ? Qui a raison ?
Selon la norme, c'est Borland qui a raison. C'est une erreur ou une
extension (selon les points de vue) connue de g++.
Oui, oui. J'ai répondu au messge de Jean-Marc, et comme je n'ai pas de
a écrit dans le message
[...]Si je désire un tableau de fonctions dont la taile sera
déterminée à l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là. J'a répondu
à Jean-Marc Bourguet que je faisias des tests. Mais effectivement, je
dois également, avant tout, tester le std::vector<>. J'ai un lobe du
cerveau qui fait de la résistance, celui qui écrit asm{bla bla}dès
qu'on le laisse seul à la maison;-)
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes,
mais logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même
type. Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que
j'étais troublé par :
pF = &fonct;
pF = fonct; // pareil
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0); // pareil
Je continue à trouver ça gênant, mais j'accepte. Que faire d'autre ?
<kanze@gabi-soft.fr> a écrit dans le message
[...]
Si je désire un tableau de fonctions dont la taile sera
déterminée à l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là. J'a répondu
à Jean-Marc Bourguet que je faisias des tests. Mais effectivement, je
dois également, avant tout, tester le std::vector<>. J'ai un lobe du
cerveau qui fait de la résistance, celui qui écrit asm{bla bla}dès
qu'on le laisse seul à la maison;-)
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes,
mais logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même
type. Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que
j'étais troublé par :
pF = &fonct;
pF = fonct; // pareil
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0); // pareil
Je continue à trouver ça gênant, mais j'accepte. Que faire d'autre ?
a écrit dans le message
[...]Si je désire un tableau de fonctions dont la taile sera
déterminée à l'exécution, je dois faire :
int(**pF)(double, double) = NULL;
Moi, je ferais plutôt :
std::vector< int (*)( double, double ) > tableau ;
Ouf, je m'inquiétais de ne pas vous voir sur ce coup-là. J'a répondu
à Jean-Marc Bourguet que je faisias des tests. Mais effectivement, je
dois également, avant tout, tester le std::vector<>. J'ai un lobe du
cerveau qui fait de la résistance, celui qui écrit asm{bla bla}dès
qu'on le laisse seul à la maison;-)
Ensuite, en C comme en C++ :
int n = 12;
pF = (int(**)(double, double))malloc(n * sizeof(int(*)(double, double)));
Si on veut travailler à un si bas niveau...
Ou en C. Pas taper, pas répondre. Connais la réponse ....
x = pF[4](4.0, 2.0);
Pas beau, puisque pF n'a pas le même type dans les deux lignes,
mais logique au vu de ce qui précède.
Je ne comprends pas cette phrase. Une variable a toujours le même
type. Le type de pF est toujours « int (**)( double, double ) ».
Pas grave, me suis mal exprimé. Je faisais référence au fait que
j'étais troublé par :
pF = &fonct;
pF = fonct; // pareil
x = pF(4.0, 2.0);
x = (*pF)(4.0, 2.0); // pareil
Je continue à trouver ça gênant, mais j'accepte. Que faire d'autre ?
et dans les faits, j'écris toujours (*pF)( 4.0, 2.0 ). Mais ça me
et dans les faits, j'écris toujours (*pF)( 4.0, 2.0 ). Mais ça me
et dans les faits, j'écris toujours (*pF)( 4.0, 2.0 ). Mais ça me