PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Problème de conversion de type au niveau des paramètres
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