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

WinDev Discussion :

Tableau Multidimensionnel ?


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut Tableau Multidimensionnel ?
    Bonjour,

    Je cherche un équivalent en windev du php $multi=array(array());

    De telle sorte que je puisse avoir des données (qui ne se suivent pas et qui n'ont pas d'index sequentiel ...) style :

    multi[numerique][numerique]=valeur

    multi[1587][73]=1155
    multi[27][158]=990
    multi[200][542]=732

    Si quelqu'un peut me donner un petit exemple de code simple ...

    J'ai fait plusieurs essais en definissant un tableau associatif, ou un tableau a 2 dimensions tel que decrit dans la doc, mais je n'ai trouvé aucune solution.

    Si on reprend l'exemple de la doc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MonTableau est un tableau de 2 par 3 chaînes
    MonTableau[1,1] = "A"
    MonTableau[1,2] = "B"
    MonTableau[1,3] = "C"
    MonTableau[2,1] = "a"
    MonTableau[2,2] = "b"
    MonTableau[2,3] = "c"
    AjouteLigne(MonTableau, "D", "E", "F")
    // Afficher le contenu de la 3° ligne
    Trace(MonTableau[3,1], MonTableau[3,2], MonTableau[3,3]) 
    // Affiche "D E F"
    Le problème, c'est que si on essai de faire quelque chose style MonTableau[200,300]="Alpha", on a automatique un plantage de l'application, pour index inconnu. Hors, je voudrais pouvoir faire quelque chose comme ca :

    MonTableau[150,500]="A"
    Montableau[1,200]="B"
    Montableau[70,10]="C"

    Comment avoir l'équivalent de array(array()) du Php ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 205
    Points : 12 786
    Points
    12 786
    Par défaut
    Bonjour,
    tu peux envisager de déclarer une structure dont le seul membre est un tableau de chaine, et de déclarer un tableau de cette structure.
    Ainsi tu te retrouves avec un tableau de tableaux.

    Tatayo.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    D'après ce que j'ai cru comprendre tu parles de tableau à deux dimensions et pas d'un tableau dans un tableau.
    Si c'est le cas, c'est d'une matrice (le vocable qu'il faut) à deux dimensions.
    Est-ce que tes dimensions sont fixes, si c'est le cas tu déclares ainsi ton tableau.
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableauFourn est un tableau de 10 par 50 chaînes
    Si tes dimensions sont variables, tu peux passer par un tableau dynamique!?
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableauClient est un tableau dynamique
    TableauClient = allouer un tableau de 4 par 7 entiers
    En espérant t'avoir guidé.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut
    tatayo: Du code en exemple ? Parce les structures, ca ne me parle pas du tout.

    Kabkab: Ben non justement, les dimensions ne sont pas fixent, les index sont générés à la volée et ne sont pas séquentiels. Les tableaux dynamique ne correspondent pas à mon besoin, voir les explications de mon premier post.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Bonjour,

    D'accord avec kabkab.
    Le tableau dynamique du WLangage est ce qu'il y a de plus proche de ton code php.

    Effectivement, il y a un problème avec le tableau dynamique parce que le nombre d'éléments d'une dimension n'est pas automatiquement étendu pour accepter n'importe quelle valeur d'index.

    On a compris que le code ci-dessous déclenche une exception (erreur fatale n° 2034) dont la cause est la tentative d'accéder à un élément hors limites.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonTableau est un tableau dynamique de 1 par 1 chaînes
     
    MonTableau[1,200] = "A"
    MonTableau[70,10] = "B"
    MonTableau[150,500] = "C"

    Mais tu peux coder une procédure qui réalise l'affectation et qui, si nécessaire, redimensionne le tableau dynamique.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PROCEDURE TableauDynamiqueInsère(LeTableauDynamique,IndexDimension1 est un entier,IndexDimension2 est un entier,LaValeur)
     
    QUAND EXCEPTION
    	SI ExceptionInfo(errCode) <> 2304 ALORS ExceptionPropage()
     
    	nDimension1 est un entier = Max(IndexDimension1,TableauInfo(LeTableauDynamique,tiDimension,1))
    	nDimension2 est un entier = Max(IndexDimension2,TableauInfo(LeTableauDynamique,tiDimension,2))		
    	Dimension(LeTableauDynamique,nDimension1,nDimension2)
    FIN
     
    LeTableauDynamique[IndexDimension1,IndexDimension2] = LaValeur

    Et voilà comment tu peux utiliser cette procédure.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonTableau est un tableau dynamique de 1 par 1 chaînes
     
    TableauDynamiqueInsère(MonTableau,1,200,"A")
    TableauDynamiqueInsère(MonTableau,70,10,"B")
    TableauDynamiqueInsère(MonTableau,150,500,"C")

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 178
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Normalement vous pouvez le faire avec les propriétés d'agrandissement du tableau, qui sont par défaut à 0.

    Extrait de l'exemple en ligne :

    // Déclare un tableau d'entiers
    TableauValeur est un tableau <agrandissement=N> d'entiers
    // Agrandit le tableau pour insérer la valeur 1 : 10
    TableauValeur[1] = 10
    // Agrandit le tableau pour insérer la valeur 5 : 50
    // Les valeurs 2, 3 et 4 sont initialisées à 0
    TableauValeur[5] = 50
    Dans votre cas quelque chose comme :
    MonTableau est un tableau <agrandissement=N> de 0 par 1 chaînes
    MonTableau[1,200] = "A"
    MonTableau[70,10] = "B"
    MonTableau[150,500] = "C"
    En théorie ça devrait fonctionner, par contre windev fera l'allocation mémoire pour tous les éléments intermédiaire, il sera donc nécessaire de surveiller ce point.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Salut themayu,
    Citation Envoyé par themayu Voir le message

    Normalement vous pouvez le faire avec les propriétés d'agrandissement du tableau, qui sont par défaut à 0.
    Es-tu sûr que le tag <agrandissement=N> fonctionne pour un tableau multidimensionnel ?

    Dans l'aide en ligne, la syntaxe avec agrandissement ne s'applique qu'aux tableaux à une dimension.
    http://doc.pcsoft.fr/fr-FR/?1514030

    Je n'ai pas testé, mais si ça fonctionne pour les tableaux multidimensionnels, ce serait bien pratique.

    à suivre...

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 178
    Points : 416
    Points
    416
    Par défaut
    Pas vraiment, c'est à tester, d'où le "Normalement"

    Je me basais sur ce point :

    <Nom du tableau> est [un] tableau [<agrandissement>] de [<Dimension>] <Type des éléments du tableau>
    Ce qui semblerait coller au problème !

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Citation Envoyé par themayu Voir le message

    Normalement vous pouvez le faire avec les propriétés d'agrandissement du tableau, qui sont par défaut à 0.

    Extrait de l'exemple en ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MonTableau est un tableau <agrandissement=N> de 0 par 1 chaînes
    MonTableau[1,200] = "A"
    MonTableau[70,10] = "B"
    MonTableau[150,500] = "C"
    J'ai testé avec le tableau "pas dynamique" qui s'auto-agrandit, et ça fonctionne !
    Dommage que l'aide en ligne ne le précise pas, c'est un peu idiot...

    Bravo themayu.

    P.S. et si tu allais annoter l'aide en ligne pour améliorer la qualité de l'information ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Bizarre... Sous WD16, je perds des valeurs.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MonTableau est un tableau <agrandissement=N> de 1 par 1 chaînes
     
    MonTableau[1,200] = "A"
    Trace("[1]",MonTableau[1,200])
     
    MonTableau[70,10] = "B"
    Trace("[2]",MonTableau[1,200],MonTableau[70,10])
     
    MonTableau[150,500] = "C" 
    Trace("[3]",MonTableau[1,200],MonTableau[70,10],MonTableau[150,500])
    La trace affiche :

    En revanche avec ma procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MonTableau est un tableau dynamique de 1 par 1 chaînes
     
    TableauDynamiqueInsère(MonTableau,1,200,"A")
    Trace("[1]",MonTableau[1,200])
     
    TableauDynamiqueInsère(MonTableau,70,10,"B")
    Trace("[2]",MonTableau[1,200],MonTableau[70,10])
     
    TableauDynamiqueInsère(MonTableau,150,500,"C")
    Trace("[3]",MonTableau[1,200],MonTableau[70,10],MonTableau[150,500])
    La trace affiche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [1] A
    [2] A B
    [3] A B C

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut
    Merci pour vos propositions à tous.

    Onepoint:Je vais essayer ta solution, merci.

  12. #12
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Bonjour,

    pour moi la meilleure solution est celle de Tatayo car :
    - Un tableau de tableau EST un tableau à 2 dimensions, c'est pareil.

    - Toutes les formes de tableau ou matice que vous proposez sont des formes indexées donc pour avoir des valeurs qui ne se suivnet pas vous êtes obligés de créer les index intermédiaires. C'est une faute. Par exemple si j'ai deux valeurs d'index 1 et 100000000 cela me parrait fou de créer les 99999999 index vides !!! pire de réserver autant d'espace mémoire que d'indexes vides

    - conceptuellement un tabelau associatif de structure ou d'objet réponds donc exactement à la demande et reflète précisement la réalité. Dans le cas d'un TableauMois[date][heure]=RDV on pense bien à un tableau de jours (qui est une variable potentiellement complexe donc une structure ou un objet) qui est composé d'heures( d'un tableau d'heures donc)

    Ensuite le choix entre tableau de structure ou tableau d'objet dépends du cas.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/12/2005, 14h41
  2. Réponses: 2
    Dernier message: 27/11/2005, 23h36
  3. Nombre de dimensions d'un tableau multidimensionnel
    Par Bruno75 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/07/2005, 10h03
  4. type de donnée tableau multidimensionnel
    Par opheliegomes dans le forum Débuter
    Réponses: 2
    Dernier message: 03/02/2005, 12h29
  5. [langage] tableau multidimensionnel
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2002, 15h58

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