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é ?
if ((lpsa) && (lpsa->cDims >= 1)) { //Retrouve le premier élément psab = lpsa->rgsabound; return psab->lLbound + psab->cElements - 1; }
return -1; }
J'ai testé et c'est tout à fait correct (comme d'hab). A noter: la fonction retourne la borne sup, donc penser à ajouter 1 si Option Base 0.
j'ai testé avec dim t(20) as long, sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou Option Base 1.
Hello,
La question a l'origine était la détermination de la borne supérieure (d'où la formule psab->lLbound + psab->cElements - 1). Pour la taille effective de l'array (quelle que soit l'option base): return psab->cElements;
François
"Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le message
de news: 44fb02af$0$1204$ba620e4c@news.skynet.be...
"Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le
message de news: 44faf502$0$10458$ba620e4c@news.skynet.be...
"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...
if ((lpsa) && (lpsa->cDims >= 1))
{
//Retrouve le premier élément
psab = lpsa->rgsabound;
return psab->lLbound + psab->cElements - 1;
}
return -1;
}
J'ai testé et c'est tout à fait correct (comme d'hab).
A noter: la fonction retourne la borne sup, donc penser
à ajouter 1 si Option Base 0.
j'ai testé avec dim t(20) as long,
sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou
Option Base 1.
Hello,
La question a l'origine était la détermination de la borne supérieure (d'où
la formule psab->lLbound + psab->cElements - 1).
Pour la taille effective de l'array (quelle que soit l'option base):
return psab->cElements;
if ((lpsa) && (lpsa->cDims >= 1)) { //Retrouve le premier élément psab = lpsa->rgsabound; return psab->lLbound + psab->cElements - 1; }
return -1; }
J'ai testé et c'est tout à fait correct (comme d'hab). A noter: la fonction retourne la borne sup, donc penser à ajouter 1 si Option Base 0.
j'ai testé avec dim t(20) as long, sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou Option Base 1.
Hello,
La question a l'origine était la détermination de la borne supérieure (d'où la formule psab->lLbound + psab->cElements - 1). Pour la taille effective de l'array (quelle que soit l'option base): return psab->cElements;
François
Driss HANIB
Merci à François et aux commentaires de jacques.
Votre échange dépasse un peu mes capacités étant auto didacte, certaines notions m'échappent encore .. mais je vais étudier tout cela et appliquer dès que possible.
Driss
"Picalausa François" a écrit dans le message de news:
"Jean-marc" a écrit dans le
message
de news: 44fb02af$0$1204$ > "Jean-marc" a écrit dans le > message de news: 44faf502$0$10458$ >> "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; >>> } > > J'ai testé et c'est tout à fait correct (comme d'hab). > A noter: la fonction retourne la borne sup, donc penser > à ajouter 1 si Option Base 0. > > j'ai testé avec dim t(20) as long, > sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou > Option Base 1. >
Hello,
La question a l'origine était la détermination de la borne supérieure
(d'où
la formule psab->lLbound + psab->cElements - 1). Pour la taille effective de l'array (quelle que soit l'option base): return psab->cElements;
François
Merci à François et aux commentaires de jacques.
Votre échange dépasse un peu mes capacités étant auto didacte, certaines
notions m'échappent encore .. mais je vais étudier tout cela et appliquer
dès que possible.
Driss
"Picalausa François" <fpicalausa@chez.com> a écrit dans le message de
news:eu7ca33zGHA.2300@TK2MSFTNGP05.phx.gbl...
"Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le
message
de news: 44fb02af$0$1204$ba620e4c@news.skynet.be...
> "Jean-marc" <NO_SPAM_jean_marc_n2@yahoo.fr.invalid> a écrit dans le
> message de news: 44faf502$0$10458$ba620e4c@news.skynet.be...
>> "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;
>>> }
>
> J'ai testé et c'est tout à fait correct (comme d'hab).
> A noter: la fonction retourne la borne sup, donc penser
> à ajouter 1 si Option Base 0.
>
> j'ai testé avec dim t(20) as long,
> sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou
> Option Base 1.
>
Hello,
La question a l'origine était la détermination de la borne supérieure
(d'où
la formule psab->lLbound + psab->cElements - 1).
Pour la taille effective de l'array (quelle que soit l'option base):
return psab->cElements;
Votre échange dépasse un peu mes capacités étant auto didacte, certaines notions m'échappent encore .. mais je vais étudier tout cela et appliquer dès que possible.
Driss
"Picalausa François" a écrit dans le message de news:
"Jean-marc" a écrit dans le
message
de news: 44fb02af$0$1204$ > "Jean-marc" a écrit dans le > message de news: 44faf502$0$10458$ >> "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; >>> } > > J'ai testé et c'est tout à fait correct (comme d'hab). > A noter: la fonction retourne la borne sup, donc penser > à ajouter 1 si Option Base 0. > > j'ai testé avec dim t(20) as long, > sizeArray(t) retourne 20, que l'on ai déclaré Option Base 0 ou > Option Base 1. >
Hello,
La question a l'origine était la détermination de la borne supérieure
(d'où
la formule psab->lLbound + psab->cElements - 1). Pour la taille effective de l'array (quelle que soit l'option base): return psab->cElements;