Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
tableau
étudié ?
merci
Driss
J'ai peut-être répondu un peu vite car en relisant mieux ton message je
m'aperçois qur ton problème consiste peut-être seulement à créer une
fonction prenant un tableau de n'importe quel type et renvoyant -1 si
celui-ci n'est pas initialisé (affecté)
En tout cas le problème m'intéresse je regarde ce que je peux faire (mes
premiers essais ne sont pas encourageant, j'arrive seulement à passer un
tableau en paramètre variant et à retrouver que ce variant est au départ
array en utilisant varType)
J'ai peut-être répondu un peu vite car en relisant mieux ton message je
m'aperçois qur ton problème consiste peut-être seulement à créer une
fonction prenant un tableau de n'importe quel type et renvoyant -1 si
celui-ci n'est pas initialisé (affecté)
En tout cas le problème m'intéresse je regarde ce que je peux faire (mes
premiers essais ne sont pas encourageant, j'arrive seulement à passer un
tableau en paramètre variant et à retrouver que ce variant est au départ
array en utilisant varType)
J'ai peut-être répondu un peu vite car en relisant mieux ton message je
m'aperçois qur ton problème consiste peut-être seulement à créer une
fonction prenant un tableau de n'importe quel type et renvoyant -1 si
celui-ci n'est pas initialisé (affecté)
En tout cas le problème m'intéresse je regarde ce que je peux faire (mes
premiers essais ne sont pas encourageant, j'arrive seulement à passer un
tableau en paramètre variant et à retrouver que ce variant est au départ
array en utilisant varType)
Bonjour,
Moi aussi, je n'ai peur être pas tout compris, voir rien, à tout
Dim t() As Integer
Dim n As Long
Dim maxi As Long
maxi = 14
ReDim t(1 To maxi)
On Error GoTo erreur
n = UBound(t)
MsgBox n
Exit Sub
erreur:
If Err = 9 Then MsgBox "0" ' indice en dehors de la plage
If Err <> 9 Then MsgBox Err
On Error Resume Next
--
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
--------------------------------------------------------------------------
"Driss HANIB" a écrit dans le message de news:
%
> Bonjour ,
> je suis à la recherche d'une méthode "robuste" pour déterminer la taille
> d'un tableau (type Array) de données quelqu'en soit le format.
> La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux
> systématiquement à 0) se met en erreur si le tableau n'a jamais été
> dimensionné !
>
> j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
> tableau non dimensionné et renvoie alors -1
> le problème que je suis oblgé dans cette focntion de définir le type du
> tableau passé en paramètre.
> ce qui implique une focntion pas type de données..
> en effet déclarer un tableau de type variant ne passe pas.. surtout que
> type de données du tableau est en général un type défini par moi même..
>
> Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
> tableau
> étudié ?
>
> merci
>
> Driss
>
>
Bonjour,
Moi aussi, je n'ai peur être pas tout compris, voir rien, à tout
Dim t() As Integer
Dim n As Long
Dim maxi As Long
maxi = 14
ReDim t(1 To maxi)
On Error GoTo erreur
n = UBound(t)
MsgBox n
Exit Sub
erreur:
If Err = 9 Then MsgBox "0" ' indice en dehors de la plage
If Err <> 9 Then MsgBox Err
On Error Resume Next
--
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
--------------------------------------------------------------------------
"Driss HANIB" <dhanib@club-internet.fr> a écrit dans le message de news:
%23tIBc4PzGHA.4176@TK2MSFTNGP06.phx.gbl...
> Bonjour ,
> je suis à la recherche d'une méthode "robuste" pour déterminer la taille
> d'un tableau (type Array) de données quelqu'en soit le format.
> La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux
> systématiquement à 0) se met en erreur si le tableau n'a jamais été
> dimensionné !
>
> j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
> tableau non dimensionné et renvoie alors -1
> le problème que je suis oblgé dans cette focntion de définir le type du
> tableau passé en paramètre.
> ce qui implique une focntion pas type de données..
> en effet déclarer un tableau de type variant ne passe pas.. surtout que
> type de données du tableau est en général un type défini par moi même..
>
> Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
> tableau
> étudié ?
>
> merci
>
> Driss
>
>
Bonjour,
Moi aussi, je n'ai peur être pas tout compris, voir rien, à tout
Dim t() As Integer
Dim n As Long
Dim maxi As Long
maxi = 14
ReDim t(1 To maxi)
On Error GoTo erreur
n = UBound(t)
MsgBox n
Exit Sub
erreur:
If Err = 9 Then MsgBox "0" ' indice en dehors de la plage
If Err <> 9 Then MsgBox Err
On Error Resume Next
--
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
--------------------------------------------------------------------------
"Driss HANIB" a écrit dans le message de news:
%
> Bonjour ,
> je suis à la recherche d'une méthode "robuste" pour déterminer la taille
> d'un tableau (type Array) de données quelqu'en soit le format.
> La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux
> systématiquement à 0) se met en erreur si le tableau n'a jamais été
> dimensionné !
>
> j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
> tableau non dimensionné et renvoie alors -1
> le problème que je suis oblgé dans cette focntion de définir le type du
> tableau passé en paramètre.
> ce qui implique une focntion pas type de données..
> en effet déclarer un tableau de type variant ne passe pas.. surtout que
> type de données du tableau est en général un type défini par moi même..
>
> Quelqu'un a-t-il donc une méthode, indépendante du type de donnée du
> tableau
> étudié ?
>
> merci
>
> Driss
>
>
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que le
type de données du tableau est en général un type défini par moi même..
"Driss HANIB" a écrit dans le message de news:
%Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que
le
type de données du tableau est en général un type défini par moi même..
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
"Driss HANIB" <dhanib@club-internet.fr> a écrit dans le message de news:
%23tIBc4PzGHA.4176@TK2MSFTNGP06.phx.gbl...
Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que
le
type de données du tableau est en général un type défini par moi même..
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
"Driss HANIB" a écrit dans le message de news:
%Bonjour ,
je suis à la recherche d'une méthode "robuste" pour déterminer la taille
d'un tableau (type Array) de données quelqu'en soit le format.
La méthode Ubound (je n'ai pas besoin de LBound, mes tableaux commençant
systématiquement à 0) se met en erreur si le tableau n'a jamais été
dimensionné !
j'ai construit une fonction qui gère alors l'erreur liée à Ubound sur un
tableau non dimensionné et renvoie alors -1
le problème que je suis oblgé dans cette focntion de définir le type du
tableau passé en paramètre.
ce qui implique une focntion pas type de données..
en effet déclarer un tableau de type variant ne passe pas.. surtout que
le
type de données du tableau est en général un type défini par moi même..
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de news:
%
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias ""
(t As Any) As Long
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
"Picalausa François" <fpicalausa@chez.com> a écrit dans le message de
news: %23CTUDatzGHA.480@TK2MSFTNGP06.phx.gbl...
"Driss HANIB" <dhanib@club-internet.fr> a écrit dans le message de news:
%23tIBc4PzGHA.4176@TK2MSFTNGP06.phx.gbl...
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias "_sizeArray@4"
(t As Any) As Long
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de news:
%
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias ""
(t As Any) As Long
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
"Jean-marc" a écrit dans le
message de news: 44fad7bd$0$1203$"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de news:
%
Hello,
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Simplement: la même chose qu'en VB, sauf qu'il ne faudra pas effectuer un
premier appel à VarPtr de vbvm, puisque la valeur du pointeur pourra être
retrouvée de suite.
Cela étant, mea culpa, je m'étais dit que je devrais expliciter ma
réponse, chose que j'ai oubliée... ce qui me fait d'ailleurs penser qu'il
ne s'agisait pas d'un void* mais d'un SAFEARRAY**. (pour l'excuse qui
semble justifiée, j'invoque moi aussi la fatigue!)
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias ""
(t As Any) As Long
t() As Any en fait
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
Le but étant de se passer de VarPtr (qui a mon avis ne fait que retourner
le pointeur qui lui est passé), il s'agirait directement de
sizeArray(t)
Et c'est bien là l'astuce, qui est de passer non pas la donnée mais bien
le SAFEARRAY.- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
Comme dit plus haut, même cose qu'en VB soit:
déférencer une ou deux fois le pointeur (en fonction de la valeur du
premier)
trouver la borne en se basant sur le SAFEARRAY (et l'écriture de cette
partie là devrait être plus naturelle puisqu'il ne faudra pas jouer à
recalculer le pointeur, le compilateur C s'en chargeant tout seul)
De plus, cette technique évite(rais... si je ne me suis pas trompé sur
varptr) les (lents) copymemory...
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
"Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le
message de news: 44fad7bd$0$1203$ba620e4c@news.skynet.be...
"Picalausa François" <fpicalausa@chez.com> a écrit dans le message de
news: %23CTUDatzGHA.480@TK2MSFTNGP06.phx.gbl...
"Driss HANIB" <dhanib@club-internet.fr> a écrit dans le message de news:
%23tIBc4PzGHA.4176@TK2MSFTNGP06.phx.gbl...
Hello,
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Simplement: la même chose qu'en VB, sauf qu'il ne faudra pas effectuer un
premier appel à VarPtr de vbvm, puisque la valeur du pointeur pourra être
retrouvée de suite.
Cela étant, mea culpa, je m'étais dit que je devrais expliciter ma
réponse, chose que j'ai oubliée... ce qui me fait d'ailleurs penser qu'il
ne s'agisait pas d'un void* mais d'un SAFEARRAY**. (pour l'excuse qui
semble justifiée, j'invoque moi aussi la fatigue!)
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias "_sizeArray@4"
(t As Any) As Long
t() As Any en fait
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
Le but étant de se passer de VarPtr (qui a mon avis ne fait que retourner
le pointeur qui lui est passé), il s'agirait directement de
sizeArray(t)
Et c'est bien là l'astuce, qui est de passer non pas la donnée mais bien
le SAFEARRAY.
- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
Comme dit plus haut, même cose qu'en VB soit:
déférencer une ou deux fois le pointeur (en fonction de la valeur du
premier)
trouver la borne en se basant sur le SAFEARRAY (et l'écriture de cette
partie là devrait être plus naturelle puisqu'il ne faudra pas jouer à
recalculer le pointeur, le compilateur C s'en chargeant tout seul)
De plus, cette technique évite(rais... si je ne me suis pas trompé sur
varptr) les (lents) copymemory...
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
"Jean-marc" a écrit dans le
message de news: 44fad7bd$0$1203$"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de news:
%
Hello,
Hello,
Si tu n'est pas contre une dll en C, il suffit d'avoir de son côté un
void* et du côt de VB un Tableau() As Any.
Hello François,
en dehors de la très jolie utilisation d'un SafeArray (héhé), j'ai une
question
Quelque chose doit m'échapper dans ce que tu veux faire en C.
Simplement: la même chose qu'en VB, sauf qu'il ne faudra pas effectuer un
premier appel à VarPtr de vbvm, puisque la valeur du pointeur pourra être
retrouvée de suite.
Cela étant, mea culpa, je m'étais dit que je devrais expliciter ma
réponse, chose que j'ai oubliée... ce qui me fait d'ailleurs penser qu'il
ne s'agisait pas d'un void* mais d'un SAFEARRAY**. (pour l'excuse qui
semble justifiée, j'invoque moi aussi la fatigue!)
Je vois bien comment faire une fonction qui attend un void* et comment la
déclarer en VB:
<snip>
Coté VB
Private Declare Function sizeArray Lib "testvb.dll" Alias ""
(t As Any) As Long
t() As Any en fait
Ce que je vois moins bien, c'est:
- l'appel de la fonction. Quelque chose comme cela:
lret = sizeArray(VarPtr(t(0))) ' comme ça ??
Le but étant de se passer de VarPtr (qui a mon avis ne fait que retourner
le pointeur qui lui est passé), il s'agirait directement de
sizeArray(t)
Et c'est bien là l'astuce, qui est de passer non pas la donnée mais bien
le SAFEARRAY.- Ce qu'on peut en faire dans la dll, car tel que je le comprends,
la fonction en C reçoit un pointeur non typé, ok, mais ensuite?
Comme dit plus haut, même cose qu'en VB soit:
déférencer une ou deux fois le pointeur (en fonction de la valeur du
premier)
trouver la borne en se basant sur le SAFEARRAY (et l'écriture de cette
partie là devrait être plus naturelle puisqu'il ne faudra pas jouer à
recalculer le pointeur, le compilateur C s'en chargeant tout seul)
De plus, cette technique évite(rais... si je ne me suis pas trompé sur
varptr) les (lents) copymemory...
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
"Picalausa François" a écrit dans le message de
news:"Jean-marc" a écrit dans le
message de news: 44fad7bd$0$1203$"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de
news: %
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
"Picalausa François" <fpicalausa@chez.com> a écrit dans le message de
news: urcRmy2zGHA.2072@TK2MSFTNGP06.phx.gbl...
"Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le
message de news: 44fad7bd$0$1203$ba620e4c@news.skynet.be...
"Picalausa François" <fpicalausa@chez.com> a écrit dans le message de
news: %23CTUDatzGHA.480@TK2MSFTNGP06.phx.gbl...
"Driss HANIB" <dhanib@club-internet.fr> a écrit dans le message de
news: %23tIBc4PzGHA.4176@TK2MSFTNGP06.phx.gbl...
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
"Picalausa François" a écrit dans le message de
news:"Jean-marc" a écrit dans le
message de news: 44fad7bd$0$1203$"Picalausa François" a écrit dans le message de
news: %"Driss HANIB" a écrit dans le message de
news: %
Donc, en résumé, ça devrait donner (non testé):
long __stdcall sizeArray (SAFEARRAY **t)
{
SAFEARRAY* lpsa = *t;
SAFEARRAYBOUND* psab;
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}