|
Problème de conversion de type au niveau des paramètres |
Iniciado por Renaud OLISTIN, 29,nov. 2004 12:52 - 6 respuestas |
| |
| | | |
|
| |
Publicado el 29,noviembre 2004 - 12:52 |
J'ai une procédure à laquelle je passe deux paramètres, une chaine de caractère et un entier. Lorsque j'appelle la procédure d'une certaine manière, j'ai une erreur disant qu'il est impossible de convertir un entier sur 8 vers un entier. Ce qui ne fait aucun sens. Voici l'exemple :
PROCEDURE proc1(p1 est une chaine, p2 est un entier) ..... .... Je l'appelle de cette manière : c est une chaine = "20" proc1("bonjour", val(c)*2+1 ) // ça provoque une erreur
Mais si je l'appelle de cette manière, ça fonctionne : c est une chaine = "20" n est un entier = val(c)*2+1 proc1("bonjour", n ) // ça marche
DONC IL Y A UN PROBLÈME DE CONVERSION DE TYPE... l'opération "val(c)*2+1" devrait retourner le plus petit type d'entier possible au lieu de retourner "entier sur 8", il devrait retourner le type "entier sur 1", ainsi, il n'y aurait pas de problème pour la conversion vers entier.
J'AI ÉTÉ SURPRIS de lire la réponse de PCSOFT qui m'a répondu qu'il est déconseillé d'indiquer les types de paramètres dans l'entête de ma procédure. Autrement dit ils me suggèrent de changer l'entête de ma procédure pour :
PROCEDURE proc1(p1, p2)
Trouvez-vous que c'est une réponse satisfaisante? Quelqu'un a-t-il déjà eu le même problème, a-t-il reçu la même réponse de PcSoft ? J'espère qu'ils vont régler le problème dans les versions suivantes.
cqfd |
| |
| |
| | | |
|
| | |
| |
Publicado el 29,noviembre 2004 - 16:58 |
Salut Marcel,
1) Remarquez que dans la procédure, j'ai déclaré le type "entier"... mais que l'erreur que j'ai c'est que Windev n'arrive pas à convertir de type "entier sur 8" vers "entier"?
2) Si je <<fais Proc1(2+1+1+1+1+1000)>>, Ce n'est pas vrai que c'est dans la procédure que l'évaluation de la commande "2+1+1+1+1+1000" devrait être faite. Si c'est le cas pour Windev, alors c'est une drôle de logique. D'autant plus que la procédure attend une adresse (passage de paramètre par adresse, en Windev, à moins qu'on mette le mot "LOCAL" devant le paramètre, n'est-ce pas?)
3) Ayant de l'expérience dans le développement des compilateurs, je crois que Windev devrait évaluer la commande, mettre le contenu dans une variable temporaire (possiblement dans la pile de la procédure appelée) et ensuite appeler ladite procédure. JUSQU'À preuve du contraire, je crois que Windev fonctionne ainsi. Le BUG c'est que le type-casting (ajustement de type) de la valeur de la commande est mis par défaut à "entier sur 8", et connaissant la logique de conversion de type, on comprend qu'après on arrive plus à convertir "entier sur 8" vers "entier". (NOTE: entier = entier sur 4). Étant donné que la valeur de la commande est 2006, le language devrait prendre le type "entier sur 2", ainsi on aurait plus de difficulté à convertir de "entier sur 2" vers "entier".
4) Autre possibilité, c'est peut-être la routine interne dans Windev qui s'occupe de ces changements de type, qui fait défaut.... Qui sait ?
<Marcel.berman@managingbusiness.be> a écrit dans le message de news:41ab77d2@news.pcsoft.fr...
On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote: J'ai une procédure à laquelle je passe deux paramètres, une chaine de caractère et un entier. Lorsque j'appelle la procédure d'une certaine manière, j'ai une erreur disant qu'il est impossible de convertir un entier sur 8 vers un entier. Ce qui ne fait aucun sens. Voici l'exemple :
PROCEDURE proc1(p1 est une chaine, p2 est un entier) .... ... Je l'appelle de cette manière : c est une chaine = "20" proc1("bonjour", val(c)*2+1 ) // ça provoque une erreur
Mais si je l'appelle de cette manière, ça fonctionne : c est une chaine = "20" n est un entier = val(c)*2+1 proc1("bonjour", n ) // ça marche
DONC IL Y A UN PROBLÈME DE CONVERSION DE TYPE... l'opération "val(c)*2+1"
devrait retourner le plus petit type d'entier possible au lieu de retourner "entier sur 8", il devrait retourner le type "entier sur 1", ainsi, il n'y
aurait pas de problème pour la conversion vers entier. J'AI ÉTÉ SURPRIS de lire la réponse de PCSOFT qui m'a répondu qu'il est déconseillé d'indiquer les types de paramètres dans l'entête de ma procédure. Autrement dit ils me suggèrent de changer l'entête de ma proc
Salut ! Ben moi je trouve que c'est assez logique ... En effet, quand tu passes ton paramêtre à la fonction, il n'a pas encore été
évalué. Le paramêtre que tu passes sera donc évalué dans la fonction. Et là, le paramêtre en question ne peut être QUE un entier, puisque tu l'a défini comme tel. N'oublie pas que par défaut, on passe les paramètres par pointeur et pas par
valeur, c'est à dire que l'on passe une adresse mémoire. Et le problème c'est que tu passes une expression complexe qui n'existe pas
en mémoire ( ce n'est pas une variable ). Je crois la syntaxe Proc1("Bonjour",(val(c)*2+1)) (Ton expression étant mise entre parenthèses) forcerait le passage du paramêtre par valeur et devrait résoudre le problème.
Tiens nous au courant ! Bien à toi !
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477
|
| |
| |
| | | |
|
| | |
| |
Publicado el 29,noviembre 2004 - 21:04 |
On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote:
J'ai une procédure à laquelle je passe deux paramètres, une chaine de caractère et un entier. Lorsque j'appelle la procédure d'une certaine manière, j'ai une erreur disant qu'il est impossible de convertir un entier sur 8 vers un entier. Ce qui ne fait aucun sens. Voici l'exemple :
PROCEDURE proc1(p1 est une chaine, p2 est un entier) .... ... Je l'appelle de cette manière : c est une chaine = "20" proc1("bonjour", val(c)*2+1 ) // ça provoque une erreur
Mais si je l'appelle de cette manière, ça fonctionne : c est une chaine = "20" n est un entier = val(c)*2+1 proc1("bonjour", n ) // ça marche
DONC IL Y A UN PROBLÈME DE CONVERSION DE TYPE... l'opération "val(c)*2+1" devrait retourner le plus petit type d'entier possible au lieu de retourner "entier sur 8", il devrait retourner le type "entier sur 1", ainsi, il n'y aurait pas de problème pour la conversion vers entier. J'AI ÉTÉ SURPRIS de lire la réponse de PCSOFT qui m'a répondu qu'il est déconseillé d'indiquer les types de paramètres dans l'entête de ma procédure. Autrement dit ils me suggèrent de changer l'entête de ma proc
Salut ! Ben moi je trouve que c'est assez logique ... En effet, quand tu passes ton paramêtre à la fonction, il n'a pas encore été évalué. Le paramêtre que tu passes sera donc évalué dans la fonction. Et là, le paramêtre en question ne peut être QUE un entier, puisque tu l'a défini comme tel. N'oublie pas que par défaut, on passe les paramètres par pointeur et pas par valeur, c'est à dire que l'on passe une adresse mémoire. Et le problème c'est que tu passes une expression complexe qui n'existe pas en mémoire ( ce n'est pas une variable ). Je crois la syntaxe Proc1("Bonjour",(val(c)*2+1)) (Ton expression étant mise entre parenthèses) forcerait le passage du paramêtre par valeur et devrait résoudre le problème.
Tiens nous au courant ! Bien à toi !
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477 |
| |
| |
| | | |
|
| | |
| |
Publicado el 29,noviembre 2004 - 23:02 |
As-tu essayé le passage du paramètre par valeur (mettre ton second paramêtre entre parenthèse) ? Dans ce cas, je pense que WD va effectivement créer une variable temporaire. Sinon, il passe le paramètre par variable, et définitivement, ton expression n'en n'est pas une... Je ne suis pas en mesure de faire le test ce soir, mais je le ferai demain matin pour voir ... Dans le cas où, même avec l'expression entre (), WD donne un message d'erreur, je serai d'accord avec toi pour dire qu'il y a un os. Si WD accepte l'expression entre () sans broncher, alors je dirais simplement que PCSoft, en tout cas dans ce cas ci, est tout à fait cohérent avec les explications données concernant le passage de paramêtres.
Bien à toi !
On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote:
Salut Marcel, 1) Remarquez que dans la procédure, j'ai déclaré le type "entier"... mais que l'erreur que j'ai c'est que Windev n'arrive pas à convertir de type "entier sur 8" vers "entier"? 2) Si je <<fais Proc1(2+1+1+1+1+1000)>>, Ce n'est pas vrai que c'est dans la procédure que l'évaluation de la commande "2+1+1+1+1+1000" devrait être faite. Si c'est le cas pour Windev, alors c'est une drôle de logique. D'autant plus que la procédure attend une adresse (passage de paramètre par adresse, en Windev, à moins qu'on mette le mot "LOCAL" devant le paramètre, n'est-ce pas?) 3) Ayant de l'expérience dans le développement des compilateurs, je crois que Windev devrait évaluer la commande, mettre le contenu dans une variable temporaire (possiblement dans la pile de la procédure appelée) et ensuite appeler ladite procédure. JUSQU'À preuve du contraire, je crois que Windev fonctionne ainsi. Le BUG c'est que le type-casting (ajustement de type) de la valeur de la commande est mis par défaut à "entier sur 8", et connaissant la logique de conversion de type, on comprend qu'après on arrive plus à convertir "entier sur 8" vers "entier". (NOTE: entier = entier sur 4). Étant donné que la valeur de la commande est 2006, le language devrait prendre le type "entier sur 2", ainsi on aurait plus de difficulté à convertir de "entier sur 2" vers "entier". 4) Autre possibilité, c'est peut-être la routine interne dans Windev qui s'occupe de ces changements de type, qui fait défaut.... Qui sait ? <Marcel.berman@managingbusiness.be> a écrit dans le message de news:41ab77d2@news.pcsoft.fr... On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote: J'ai une procédure à laquelle je passe deux paramètres, une chaine de caractère et un entier. Lorsque j'appelle la procédure d'une certaine manière, j'ai une erreur disant qu'il est impossible de convertir un entier sur 8 vers un entier. Ce qui ne fait aucun sens. Voici l'exemple :
PROCEDURE proc1(p1 est une chaine, p2 est un entier) .... ... Je l'appelle de cette manière : c est une chaine = "20" proc1("bonjour", val(c)*2+1 ) // ça provoque une erreur
Mais si je l'appelle de cette manière, ça fonctionne : c est une chaine = "20" n est un entier = val(c)*2+1 proc1("bonjour", n ) // ça marche
DONC IL Y A UN PROBLÈME DE CONVERSION DE TYPE... l'opération "val(c)*2+1" devrait retourner le plus petit type d'entier possible au lieu de retourner "entier sur 8", il devrait retourner le type "entier sur 1", ainsi, il n'y aurait pas de problème pour la conversion vers entier. J'AI ÉTÉ SURPRIS de lire la réponse de PCSOFT qui m'a répondu qu'il est déconseillé d'indiquer les types de paramètres dans l'entête de ma procédure. Autrement dit ils me suggèrent de changer l'entête de ma proc
Salut ! Ben moi je trouve que c'est assez logique ... En effet, quand tu passes ton paramêtre à la fonction, il n'a pas encore été évalué. Le paramêtre que tu passes sera donc évalué dans la fonction. Et là, le paramêtre en question ne peut être QUE un entier, puisque tu l'a défini comme tel. N'oublie pas que par défaut, on passe les paramètres par pointeur et pas par valeur, c'est à dire que l'on passe une adresse mémoire. Et le problème c'est que tu passes une expression complexe qui n'existe pas en mémoire ( ce n'est pas une variable ). Je crois la syntaxe Proc1("Bonjour",(val(c)*2+1)) (Ton expression étant mise entre parenthèses) forcerait le passage du paramêtre par valeur et devrait résoudre le problème.
Tiens nous au courant ! Bien à toi !
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477 |
| |
| |
| | | |
|
| | |
| |
Publicado el 30,noviembre 2004 - 10:32 |
Rien n'y fait... PROCEDURE proc1(c est une chaine,p est un entier) ............
APPEL: i est un entier proc1("a",i*100+2) OU proc1("a",(i*100+2))
J'ai toujours l'erreur disant qu'il ne peut convertir "entier sur 8" vers "entier"... autrement dit : il a affecter le type "entier sur 8" au résultat de l'évaluation.
cqfd
<Marcel.berman@managingbusiness.be> a écrit dans le message de news:41ab9352@news.pcsoft.fr... > As-tu essayé le passage du paramètre par valeur (mettre ton second paramêtre
entre parenthèse) ? Dans ce cas, je pense que WD va effectivement créer une variable temporaire. > Sinon, il passe le paramètre par variable, et définitivement, ton expression
n'en n'est pas une... Je ne suis pas en mesure de faire le test ce soir, mais je le ferai demain matin pour voir ... Dans le cas où, même avec l'expression entre (), WD donne un message d'erreur, je serai d'accord avec toi pour dire qu'il y a un os. Si WD accepte l'expression entre () sans broncher, alors je dirais simplement que PCSoft, en tout cas dans ce cas ci, est tout à fait cohérent avec les explications données concernant le passage
de paramêtres. Bien à toi ! On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote: Salut Marcel,
1) Remarquez que dans la procédure, j'ai déclaré le type "entier"... mais
que l'erreur que j'ai c'est que Windev n'arrive pas à convertir de type "entier sur 8" vers "entier"?
2) Si je <<fais Proc1(2+1+1+1+1+1000)>>, Ce n'est pas vrai que c'est dans
la procédure que l'évaluation de la commande "2+1+1+1+1+1000" devrait être faite. Si c'est le cas pour Windev, alors c'est une drôle de logique. D'autant plus que la procédure attend une adresse (passage de paramètre par adresse, en Windev, à moins qu'on mette le mot "LOCAL" devant le paramètre, n'est-ce pas?)
3) Ayant de l'expérience dans le développement des compilateurs, je crois
que Windev devrait évaluer la commande, mettre le contenu dans une variable temporaire (possiblement dans la pile de la procédure appelée) et ensuite
appeler ladite procédure. JUSQU'À preuve du contraire, je crois que Windev fonctionne ainsi. Le BUG c'est que le type-casting (ajustement de type) de la valeur de la commande est mis par défaut à "entier sur 8", et connaissant la logique de conversion de type, on comprend qu'après on arrive plus à convertir "entier sur 8" vers "entier". (NOTE: entier = entier sur 4). Étant donné que la valeur de la commande est 2006, le language devrait prendre le type "entier sur 2", ainsi on aurait plus de difficulté à convertir de "entier sur 2" vers "entier". 4) Autre possibilité, c'est peut-être la routine interne dans Windev qui s'occupe de ces changements de type, qui fait défaut.... Qui sait ? <Marcel.berman@managingbusiness.be> a écrit dans le message de news:41ab77d2@news.pcsoft.fr... On 29-Nov-2004, "Renaud OLISTIN" <rolistin@lsidev.com> wrote: J'ai une procédure à laquelle je passe deux paramètres, une chaine de > > > > caractère et un entier. Lorsque j'appelle la procédure d'une certaine
manière, j'ai une erreur disant qu'il est impossible de convertir un entier sur 8 vers un entier. Ce qui ne fait aucun sens. Voici l'exemple :
PROCEDURE proc1(p1 est une chaine, p2 est un entier) .... ... Je l'appelle de cette manière : c est une chaine = "20" proc1("bonjour", val(c)*2+1 ) // ça provoque une erreur
Mais si je l'appelle de cette manière, ça fonctionne : c est une chaine = "20" n est un entier = val(c)*2+1 proc1("bonjour", n ) // ça marche
DONC IL Y A UN PROBLÈME DE CONVERSION DE TYPE... l'opération "val(c)*2+1" devrait retourner le plus petit type d'entier possible au lieu de retourner "entier sur 8", il devrait retourner le type "entier sur 1", ainsi, il
n'y aurait pas de problème pour la conversion vers entier. J'AI ÉTÉ SURPRIS de lire la réponse de PCSOFT qui m'a répondu qu'il est déconseillé d'indiquer les types de paramètres dans l'entête de ma procédure. Autrement dit ils me suggèrent de changer l'entête de ma proc
Salut ! Ben moi je trouve que c'est assez logique ... En effet, quand tu passes ton paramêtre à la fonction, il n'a pas encore
été évalué. Le paramêtre que tu passes sera donc évalué dans la fonction. Et là, le paramêtre en question ne peut être QUE un entier, puisque tu l'a défini comme tel. N'oublie pas que par défaut, on passe les paramètres par pointeur et pas
par valeur, c'est à dire que l'on passe une adresse mémoire. Et le problème c'est que tu passes une expression complexe qui n'existe
pas en mémoire ( ce n'est pas une variable ). Je crois la syntaxe Proc1("Bonjour",(val(c)*2+1)) (Ton expression étant mise entre parenthèses) forcerait le passage du paramêtre par valeur et devrait résoudre le problème.
Tiens nous au courant ! Bien à toi !
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477 |
| |
| |
| | | |
|
| | |
| |
Publicado el 30,noviembre 2004 - 13:40 |
@jbt, quelque chose t'a échappé...
Je ne veux pas avoir un entier sur 8, je veux avoir un entier (= entier sur 4), d'ailleurs dans la déclaration de ma procédure, c'est un entier que j'attends. Windev applique le type d'entier sur 8 au résultat de l'expression en question, du coup, il n'arrive plus à convertir cet entier sur 8 vers un entier que la procédure attend.
Le but de "typer" les paramètres, c'est de détecter au moment du codage les bugs qui risquent de se produire à cause des problèmes de conversion de types... n'est-ce pas?
Si j'ai :
PROCEDURE proc1(p1) i est un entier = p1*2
si dans d'autres codes, j'ai fait : s1 est une chaine = "allo" s2 est un entier = 20 proc1(s1) // accidentellement j'ai mis s1 au lieu de s2
Tu comprends qu'à la compilation (durant le codage), je n'aurai pas d'erreur... Mais au moment de l'exécution, BOOMMMM!!!
Comprends-tu ?
"JBT" <spam@ifrance.com> a écrit dans le message de news:41ac803c@news.pcsoft.fr...
Je partage l'avis de marcel : tu demandes explicitement à avoir un entier
sur 8, tu dois donc appeler ta procédure avec en entier sur 8. Du moment que tu donnes autre chose qu'un entier sur 8 tu auras une erreur normale.
Je suis aussi d'accord avec la réponse que le support t'a donnée, à savoir
de ne pas typer. Le langage se débrouille de tout dans ce cas. Le typage est à réserver à l'utilisation d'assemblage dotnet et autre.
-- forumnewswindev@ifrance.com
|
| |
| |
| | | |
|
| | |
| |
Publicado el 30,noviembre 2004 - 16:56 |
Je partage l'avis de marcel : tu demandes explicitement à avoir un entier sur 8, tu dois donc appeler ta procédure avec en entier sur 8. Du moment que tu donnes autre chose qu'un entier sur 8 tu auras une erreur normale.
Je suis aussi d'accord avec la réponse que le support t'a donnée, à savoir de ne pas typer. Le langage se débrouille de tout dans ce cas. Le typage est à réserver à l'utilisation d'assemblage dotnet et autre.
-- forumnewswindev@ifrance.com |
| |
| |
| | | |
|
| | | | |
| | |
|