PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.
  • Index
  •  » Powerscripts
  •  » Récupérer les valeurs d'un tableau de ULong passé par référence

#1 25-10-2011 12:18:06

Tuk  
Bienfaiteur du site
Award: bf
Lieu: La verpilliere (38)
Date d'inscription: 27-03-2009
Messages: 7
Pépites: 35
Banque: 0

Récupérer les valeurs d'un tableau de ULong passé par référence

Bonjour a tous,

J'utilise un contrôle OLE de LOXANE permettant d'effectuer des calculs d'itinéraires et de distance. Dans ce controle, j'utilise la méthode itiGetDetailedResult :

Code: pb

 DOC LOXANE : LONG itiGetDetailedResult (LONG in_iDetailType, LONG* out_hID, LONG* out_hDistances, LONG* out_hTimes)

Donc un long et trois tableaux de long (Le browser OLE me donne la meme définition sans les *)

Je peux appeler la méthode par les deux syntaxes suivantes :

Code: pb

ULong  a_pays, a_dist, a_time
ole_route_finder.object.itiGetDetailedResult (1, ref a_pays, ref a_dist, ref a_time)
ou
ole_route_finder.object.itiGetDetailedResult (1, a_pays, a_dist, a_time)


Si j'essaye de passer des variables de type ULONG a_pays[] (avec ou sans ref), je me prends un message "invalid parameter type"

Mon problème est que je ne sais pas comment récupérer les valeurs de ces tableaux ( a priori j'ai un pointeur sur le tableau ?!)

Quelqu'un aurait-il une idée ?
Merci a tous

Hors ligne

 

#2 25-10-2011 12:47:06

seki  
0x73656B69
Award: bf
Lieu: Vittoncourt & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1121
Pépites: 4,296,080,220
Banque: 9,223,372,036,854,775,808
Site web

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

Tuk a écrit:

Code: pb

ULong  a_pays, a_dist, a_time

Pour que ça fonctionne il faut bien déclarer 3 tableaux de longs, ensuite à mon avis il faudrait dimensionner les tableaux avant l'appel à itiGetDetailedResult() à la bonne taille. Sans ça l'échange entre PB et l'OLE doit déborder et PB diagnostique ça comme un mauvais passage de paramètres.
Est-ce que le contrôle OLE fournit une méthode pour obtenir le nombre de résultats ?

Un truc du style

Code: pb

ULong  a_pays[], a_dist[], a_time[], nb_values
nb_values = ole_route_finder.object.itiGetResultCount()
a_pays[nb_values] = 0
a_dist[nb_values] = 0
a_time[nb_values] = 0
ole_route_finder.object.itiGetDetailedResult (1, a_pays[], a_dist[], a_time[])


pour dimensionner les tableaux avant l'appel devrait suffire.

Dernière modification par seki (25-10-2011 12:49:48)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#3 25-10-2011 16:28:04

Tuk  
Bienfaiteur du site
Award: bf
Lieu: La verpilliere (38)
Date d'inscription: 27-03-2009
Messages: 7
Pépites: 35
Banque: 0

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

Merci Seki pour ta réponse,

Malheureusement, c'est la même méthode qui me donne la taille des tableaux (valeur de retour de la fonction).
J'ai tout de même essayé avec un trajet sur 2 pays (FR - IT) avec des tableaux [2] (avec ou sans ref)  et idem.

A partir du moment ou je lui donne une variable de type tableau, j'ai l'erreur sur le type de paramètre.

Hors ligne

 

#4 25-10-2011 16:53:32

seki  
0x73656B69
Award: bf
Lieu: Vittoncourt & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1121
Pépites: 4,296,080,220
Banque: 9,223,372,036,854,775,808
Site web

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

Tuk a écrit:

Merci Seki pour ta réponse,

Malheureusement, c'est la même méthode qui me donne la taille des tableaux (valeur de retour de la fonction).
J'ai tout de même essayé avec un trajet sur 2 pays (FR - IT) avec des tableaux [2] (avec ou sans ref)  et idem.

Ah. Bon.
En fait je n'utilise pas d'OCX/OLE en PB ici; je donnais des pistes par rapport aux appels API que nous utilisons.

Tuk a écrit:

A partir du moment ou je lui donne une variable de type tableau, j'ai l'erreur sur le type de paramètre.

Et si tu utilises "ref long" en type de paramètre pour les long* et que tu passes le premier élément de chaque tableau comme argument ça passe ?
Il faudrait tout de même connaître le nombre d'éléments pour dimensionner les tableaux.
Est-ce que itiGetDetailedResult() est capable de donner le nombre d’éléments sans essayer de remplir les tableaux ? Peut-être en passant 0 comme valeur pour les long* ?

À titre d'essai, si tu alloues des tableaux de [32000] ou une autre valeur suffisamment grande, ça donne quoi ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#5 26-10-2011 11:32:23

Tuk  
Bienfaiteur du site
Award: bf
Lieu: La verpilliere (38)
Date d'inscription: 27-03-2009
Messages: 7
Pépites: 35
Banque: 0

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

J'ai un peu avancé dans ma démarche.

Maintenant, la fonction itiGetDetailedResult me retourne des valeurs (avant non car le moteur de calcul etait mal initialisé). Par contre, je ne peux pas transmettre des paramètres de type tableau de long, seulement des long, mais maintenant ceux-ci on des valeurs de retour. A priori cela ressemble à des handles ou des adresses mémoire.

J'ai donc le même problème : Comment récupérer les valeurs pointées par ces handles / pointeur.

Existe t-il l'équivalent de string(XXX, 'address') pour les long ?

Si quelqu'un a une idée, je suis preneur.

Pour info, voici le code de lancement de la fonction (les refs sont obligatoires sinon, les variables restent à 0):

Code: pb

ll_ret = ole_route_finder.object.itiGetDetailedResult (1, ref a_pays, ref a_dist, ref a_time)

Bonne journée à tous

Hors ligne

 

#6 26-10-2011 11:36:05

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 725
Pépites: 11,358
Banque: 100,221,387,868,884,304
Site web

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

tu n'as pas la doc du composant ?


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#7 26-10-2011 11:50:07

Tuk  
Bienfaiteur du site
Award: bf
Lieu: La verpilliere (38)
Date d'inscription: 27-03-2009
Messages: 7
Pépites: 35
Banque: 0

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

xlat a écrit:

tu n'as pas la doc du composant ?

Si, bien sur, mais aucun exemple pour Powerbuilder, même si la doc confirme que le contrôle peut être utilisé dans Powerbuilder.

La doc confirme bien l'utilisation de tableaux :

LONG itiGetDetailedResult (LONG in_iDetailType, LONG* out_hID, LONG* out_hDistances, LONG* out_hTimes)
Retourne les distances et temps par pays ou par type de route suite à un calcul d’itinéraire.
Paramètres :
- Out_hID            Tableau des types de route (si in_iDetailType = 0) ou des codes pays traversés (si in_iDetailType = 1)
- Out_hDistances  Tableau des distances pour chaque type de route (si in_iDetailType = 0) ou chaque pays traversé (si in_iDetailType = 1)
- Out_hTimes       Tableau des temps pour chaque type de route (si in_iDetailType = 0) ou chaque pays traversé (si in_iDetailType = 1)

Valeur de retour :
- N Nombre de types de route si in_iDetailType = 0. Nombre de pays traversés si in_iDetailType = 1.
-1 Erreur

Dernière modification par Tuk (26-10-2011 15:06:26)

Hors ligne

 

#8 26-10-2011 14:14:59

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 725
Pépites: 11,358
Banque: 100,221,387,868,884,304
Site web

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

ce qui m'étonne c'est le format du prototype qui contient 'LONG*' ce qui semble plutôt faire référence à du C/C++, c'est ce que tu vois dans le Browser d'OLE de Powerbuilder ?


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#9 26-10-2011 15:09:18

Tuk  
Bienfaiteur du site
Award: bf
Lieu: La verpilliere (38)
Date d'inscription: 27-03-2009
Messages: 7
Pépites: 35
Banque: 0

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

Oui, le browser me donne la définition

long itiGetDetailedResult (long in_iDetailType, long out_hID, long out_hDistances, long out_hTimes)

pour les parametres "out", le h de hID ou hDistances signifie Handle je pense. donc pointeur sur tableau

Je suis en train de faire des essais avec le string(a_pays, "address")

Hors ligne

 

#10 26-10-2011 15:21:14

seki  
0x73656B69
Award: bf
Lieu: Vittoncourt & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1121
Pépites: 4,296,080,220
Banque: 9,223,372,036,854,775,808
Site web

Re: Récupérer les valeurs d'un tableau de ULong passé par référence

Tuk a écrit:

pour les parametres "out", le h de hID ou hDistances signifie Handle je pense.

Je pense que c'est probable.
Par contre :

donc pointeur sur tableau

Alors là c'est toi qui le dit...
Ça peut être un handle vers une structure particulière définie dans le composant, ou une valeur à réutiliser dans d'autres appels.
La doc ne précise pas ce que retourne la méthode ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » Récupérer les valeurs d'un tableau de ULong passé par référence

Pied de page des forums

Propulsé par FluxBB 1.2.22