IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

utiliser une variable pour enregistrer la taille max du tableau


Sujet :

VB 6 et antérieur

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut utiliser une variable pour enregistrer la taille max du tableau
    bonsoir toutes et tous

    j'ai très souvent besoin d'avoir la dimension de mon tableau dynamique.
    dans une ligne de code comme celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableau(Ubound(MonTableau)).SousTablo(Ubound(MonTableau(Ubound(MonTableau)).SousTablo))
    est ce que ceci ne serait pas plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaxMonTableau=Ubound(MonTableau)
    MonTableau(maxMonTableau).SousTablo(Ubound(MonTableau(MaxMonTableau).SousTablo))
    simplement pour essayer d'avoir un code plus rapide et peut être plus correcte
    qu'en pensez vous
    merci d'avance

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    MonTableau(maxMonTableau).SousTablo(Ubound(MonTableau(MaxMonTableau).SousTablo))
    Une telle syntaxe ne peut pas passer pour la simple raison que MonTableau est un tableau qui peut contenir n'importe quel type de données.
    Le point(.) entre MonTableau et SousTablo indiquerait que MonTableau est un objet et que SousTablo est l'une de ses propriétés; ce qui n'est le cas.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Public Type RetCel
        ligne As Integer
        colonne As Integer
        valeur As Integer
        cand As Integer
    End Type
    Public Type RetCelS
        RetCelS() As RetCel
    End Type
     
    Public RetourS() As RetCelS 'ensemble des retours en arrière
     
     
    ......
    ReDim Preserve RetourS(UBound(RetourS)).RetCelS(1 To nbEnreg)
     
    'j'aurais pu écrire:
     
    ReDim Preserve RetourS(UBound(RetourS)).RetCelS(1 To (RetourS(UBound(RetourS)).RetCelS))
    .......
    ce code fonctionne parfaitement

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    OK mais la déclaration Public RetourS() As RetCelS fait référence au TYPE et non au tableau.

    D'ailleurs si tu exécutes ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim RCS As RetCelS
    Private Sub Form_Click()
        MsgBox VarType(RCS.RetCelS)
    End Sub
    tu auras un beau message d'erreur. Il faudra alors remonter au type RetCel...
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    ok mais
    qu'est ce qu'il vaut mieux mettre la taille du tableau dans une variable MaxTablo=Ubound(Tablo) et appeler à chaque fois la variable si besoin de la taille du tablo ou alors appeler à chaque fois Ubound(Tablo)?
    le quel est le plus rapide ? est ce nécessaire d’embarrasser le programme avec une variable supplémentaire

  6. #6
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Toute variable déclarée(utilisée ou non) occupe de la mémoire.
    Moi, j'opterais pour Ubound(Tablo) plus rapide, quoiqu'une variable(intMaxTbl par exemple) qui contiendrait cette valeur serait plus explicite.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    merci pour cette info

    et à quel moment les variables sont elles chargées au début du programme? au début de chaque procédure pour les variables déclarées dans une procédure? au début d'un module pour toutes les variables?

  8. #8
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Elles sont chargées là où elles sont déclarées et appelées.
    Si une procédure(Sub) ou une fonction n'est pas appelée, les variables qui y sont déclarées(variables locales) ne sont pas utilisées. (Je tente de dire comme si elles n'existaient pas)
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  9. #9
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    les variables publiques elles seront chargées dès le début du programme ou seulement si une procédure ou fonction les appels
    et les variables déclarées au niveau d'un module elles seront chargées dès qu'une procédure ou fonction y fera appel ?

  10. #10
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Le système réserve(alloue) une mémoire à une variable déclarée Public ou Global même si elle n'est pas appelée(utilisée) et elle vue dans tous les modules(Feuille, module de base .bas module de classe .cls...) elle est chargée lorsqu'elle appelée.


    Allocution de mémoire et chargement sont, à mon sens, deux concepts différents : Allocution de mémoire c'est en quelque sorte une réservation d'une certaine quantité de mémoire alors que chargement est une utilisation réelle de la mémoire déjà réservée.

    De ce fait, à toute variable variable déclarée (locale ou globale) correspondrait une partie qui lui est réservée de la mémoire et qui n"est utilisée que si cette variable est appelée.
    Par exemple, si une variable est déclarée en locale(Dim ou Private) dans une procédure et/ou fonction, elle utilise la mémoire qui lui est allouée si la procédure/fonction est appelée. Une fois l'utilisation de la fonction/procédure est terminée, la variable est réinitialisée donc devient vide et n'utilise plus la mémoire qui lui reste cependant allouée.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  11. #11
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    bonsoir

    de la mémoire allouée, quelle soit vide ou quelle soit chargée d'une variable donc appelée par une fonction, occupe toujours autant de place dans l'espace mémoire!
    Si j'ai bien compris quelque soit la position de la variable il lui ait réservé, alloué un espace mémoire qui ne peut plus être utilisé

  12. #12
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Oui en quelque sorte.
    Mais vue la taille des nouvelles mémoires, cela n'a d'influence que si le nombre de variables est considérable.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  13. #13
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    ok merci pour ces éclaircissements.

  14. #14
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,

    L'optimisation d'un code (et de la nécessité de l'optimisation) dépend de plusieurs facteurs.
    Quelques exemples :
    - le moment où le code à étudier est exécuté :
    par exemple, gagner quelques 1/100ème de secondes lors d'interaction avec l'utilisateur final n'a que peu ou pas d'intérêts
    alors que dans une boucle très répétitive chaque cycle compte,
    - utiliser une variable intermédiaire de stockage est utile si l'appel est répétitif sans que la valeur change,
    - le temps de calcul n'est pas toujours la seule incidence à prendre en compte : la surcharge du processeur peut aussi être importante
    etc.


    La solution pour optimiser un code est évidemment de mesurer en premier lieu le temps écoulé par bloc à étudier.
    La 1ère solution serait d'utiliser une mesure de temps (MicroTickCount - VB6i.dll)
    qui mesure un temps avec précision puisqu'elle pratique une évaluation très inférieure à la 1ms
    alors que GetTickCount n'est précis qu'à n Ms(10 à 20) .
    La mesure de temps a le mérite d'être parlante mais la précision d'évaluation est plutôt du coté de la fonction RDTSC
    qui mesure le nombre de cycles depuis l'ouverture de la session.
    Ces 2 méthodes ont le mérite aussi de ne pas nécessiter l'utilisation d'une boucle répétitive du même test
    qui est souvent trompeuse car c'est souvent le premier appel qui consomme des ressources.


    Coté récupération des limites de tableaux, voir du coté de SA() qui retourne ue image complète d'un tableau
    (taille, dimensions, limites etc.)
    Il te reste à tester avec RDTSC pour évaluer quelle solution te convient le mieux


    Concernant l'exemple précité, l'usine à gaz du tableau de tableau - a()() : sauf erreur de ma part
    cela revient à faire un tableau de tableau a(0 to 0, 0 to m)(0 to 0, 0 to n) !!!
    Sauf cas très particuliers qui ici m'échappe (hormis peut-être pouvoir faire des redim preserve sur chaque dimension finale)
    un tableau à 2 dim serait plus lisible a(0 to m, 0 to n).

    Pour info, coté gestion de Tableau, la même librairie (VB6i) permet également
    - de redimensionner totalement un tableau à 2 dimensions (pas seulement la dernière dim comme avec redim preserve de vb6) avec Preserve2
    si cette fonction peut t'être utile mais elle est à vérifier avec les tableaux UDT !

  15. #15
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    bonjour
    merci pour ces précisions.
    Je pense effectivement que mon programme ne se ralentit pas pour quelques variables intermédiaires qui rendent mon code plus lisible et plus facile à écrire.
    Mais je vais regardé tout de même ces fonctions que tu m'as cité

    quant à mon usine à gaz, je n'ai pas bien saisi tes explications, alors voilà ce que j'ai voulu faire avec mes tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    'le type retCel permet de mémoriser les propriétés d'une cellule de "sudoku"
    Public Type RetCel
        ligne As Integer
        colonne As Integer
        valeur As Integer
        cand As Integer
    End Type
     
    'RetCelS() est un tableau de plusieurs cellules qui ont été modifiées au cours de la même opération (ex: suppression d'un candidat sur plusieurs cellules)
    Public Type RetCelS
        RetCelS() As RetCel
    End Type
     
    Retours() est le tableau de tous les coups  
    Public RetourS() As RetCelS 'ensemble des retours en arrière
    je ne sais pas par avance le nombre de cellules touchées par une action, j'aurais pu mettre le nombre maximum de 20 et bien sûr ne pas tout utiliser
    Et pour le tableau Retours() là je suis obligé de le redimensionner au fur et à mesure car si non je ne saurais pas quel est le dernier enregistrement.

  16. #16
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par marco62118 Voir le message
    ...
    quant à mon usine à gaz, je n'ai pas bien saisi tes explications, alors voilà ce que j'ai voulu faire avec mes tableaux:
    ...
    Un tableau (1 to m) est équivalent à un tableau (1 to 1, 1 to m)
    un tableau (1 to m) de tableau imbriqué (1 to n) comme tu le décris peut s'écrire montableau()() ; il est donc équivalent à
    montableau(1 to m)(1 to n) ou montableau(1 to 1, 1 to m)(1 to 1, 1 to n).
    La construction montableau(1 to m, 1 to n) remplit les mêmes fonctions et couvre les mêmes plages de valeurs.

    C'était juste un constat général sans s'occuper de savoir si l'exemple est cohérent.

  17. #17
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    ok

    au niveau rapidité ou encombrement mémoire les 2 méthodes font une différence?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser une variable pour modifier la taille d'une cellule <td>
    Par morora69 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/06/2010, 16h52
  2. Utiliser une variable pour mettre des étiquettes visible
    Par patate5555 dans le forum VBA Access
    Réponses: 8
    Dernier message: 21/06/2007, 13h51
  3. Réponses: 9
    Dernier message: 16/02/2007, 15h10
  4. Utiliser une variable pour stocker les noms d'objets.
    Par en_gel_ho dans le forum Access
    Réponses: 4
    Dernier message: 03/01/2007, 16h44
  5. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo