OVH Cloud OVH Cloud

trouver la taille d'un tableau

12 réponses
Avatar
Driss HANIB
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

2 réponses

1 2
Avatar
Picalausa François
"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
Avatar
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




1 2