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 :

Indirection sur membre tableau de structure d'une classe [WD17]


Sujet :

WinDev

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut Indirection sur membre tableau de structure d'une classe
    Bonjour,

    j'essaye d'accéder (afficher/alimenter) des membres d'une classe qui sont des tableaux de structure.

    1) J'arrive à énumérer pour un membre tableau, le nombre de structure affectées, mais je n'arrive pas à accéder aux éléments de mes structures... une idée ?

    2) Comment énumérer tous les éléments de la structure courante (parcourue par l'indice i dans le tableau membre courant) ? (exemple ici le membre "m_tabAM1" possède l'élément AM101 (cf exemple) mais d'autres également, je voudrais rendre cela générique.

    Merci!

    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
    clObjet est un ClasseLambda()
    defCourant est une Définition = RécupèreDéfinition(clObjet)
    varCourant est une Description de Variable
    			
    POUR TOUT varCourant DE defCourant..Variable
    	SELON varCourant..Définition..Type
    		CAS 34 // tableau
    			SELON varCourant..Nom
    				CAS "m_tabAM1" //on teste pour un membre en particulier 
    					POUR i = 1 _A_ {clObjet,varCourant..Nom}..Occurrence
                                           //ne se compile pas
                                            Trace({clObjet ,varCourant..Nom}[i]+{".AM101",indVariable})
                                          //solution qui fonctionne, mais en dur donc pas viable:
                                          Trace({clObjet ,varCourant..Nom}[i].AM101)						
    					FIN
    				AUTRE CAS	
    			FIN						
    		AUTRE CAS //les autres cas ne sont pas gérés						
    	FIN
    FIN //On passe au membre suivant

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Points : 188
    Points
    188
    Par défaut
    Bonjour,

    Peux-tu essayer ceci sans préciser le type d'indirection :

    Trace({clObjet ,varCourant..Nom[i]+".AM101"})

    Si ça ne fonctionne pas, peut-être que tu trouveras la solution dans cette discussion.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    En fait Windev m'interdit d'utiliser un indice dans mon indirection, je ne peux pas compiler avec ce code

    je vais voir votre lien : merci!

  4. #4
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Utilisez une fonction dont le paramètre est votre structure ou même votre tableau de structure.
    Ca sera plus lisible et ça marchera.


    Franchement, je ne vous encourage pas à continuer à construire votre usine à gaz, dans la plupart des cas c'est injustifié.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    On vient de me donner la solution ici :
    http://forum.pcsoft.fr/thread.awp?gr...cur=273840&v=2

    En fait je me doute qu'il existe d'autres solutions, mais voici pourquoi je fonctionne comme ça :

    je remonte depuis un FTP des fichiers calqués sur un protocole de transactions monétaires. J'alimente ma base via une classe qui allimente ses membres en fonction des infos qu'elle trouve dans ces fichiers (rien de constant, beaucoup d'aléatoire). Hors il arrive que des fichiers remontés soient des doublons "non copies conforme" à ne pas inclure dans la base. Ils ne sont pas conformes car plusieurs informations (mais ps toutes!) sont identiques (mais leur apparition dans le fichier est aléatoire...). Bref il faut que je compare certaines infos dans mes fichiers,sans êtres sûr qu'elles soient présentes...
    Ma méthode : j'alimente les membres de mon objet par 2 manière : fichier physique ou flux binaire. Bref j'essaye de rendre générique la comparaison des membres passés en paramètres à une méthode entre 2 objets : l'actuel à importer et ceux remontées de la base (et stockés en flux binaire) pour alimenter un objet de cette même classe déclaré dans une méthode de la classe.
    Ainsi je sérialise mes structures contenues dans des tableaux associatifs et je les compare avec les 2 objets : celui "candidat" à la base et celui ayant ré-alimenté ses membres depuis le flux binaire.

    Il y a sans doute d'autres solutions, plus simples, plus optimisées mais voilà la logique à laquelle je suis arrivé.

  6. #6
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    La solution dont vous parlez fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    slChaine={clObjet ,varCourant..Nom}[i]
    Or si slChaine est une chaîne et si {clObjet ,varCourant..Nom}[i] est une structure, ça fera un plantage.

    A votre place j'aurais fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFonction({clObjet, varCourant..Nom}[i])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE MaFonction(stBob)
    Trace({"stBob.AM101"})
    Ou bien cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace({clObjet, varCourant..Nom + "[" + i + "].AM101"}) // Moins lisible
    WinDev n'interdit pas les indices dans les indirections, il interdit le "i" qui n'est pas déclaré explicitement et l'indice qui n'est pas un littéral.

    Pensez à utiliser des tableaux locaux si ce n'est déjà fait. C'est un piège de WinDev, il faut bien préciser "est un tableau local de ...".

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Merci beaucoup pour vos précieux conseils, je pense qu'ils vont m'être très utiles

    Je ne connaissais pas la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {clObjet, varCourant..Nom + "[" + i + "].AM101"}
    ça m'aidera bien je pense, merci encore.

    Finalement, comme mon objectif est de comparer les structures 2 à 2 entre 2 objets de la même classe, j'ai opté pour la Sérialisation de ces structure et la comparaison des buffers résultant. Ainsi je n'avais pas à "descendre" au niveau des éléments/membres de mes structures.

  8. #8
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Citation Envoyé par cladoo Voir le message
    Finalement, comme mon objectif est de comparer les structures 2 à 2 entre 2 objets de la même classe, j'ai opté pour la Sérialisation de ces structure et la comparaison des buffers résultant. Ainsi je n'avais pas à "descendre" au niveau des éléments/membres de mes structures.
    Ah bon ?
    Je croyais que :
    Citation Envoyé par cladoo
    Ils ne sont pas conformes car plusieurs informations (mais ps toutes!) sont identiques

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Les tableaux associatifs contenant les structures issus des blocs lus dans le fichier sont à comparer mais pas tous, certains blocs vont bouger (genre incrémentation de compteur etc...) et ceux-là ne font pas partir des structures à comparer, nous avons défini parmi les blocs pouvant apparaître ceux qui sont à tester pour vérifier le "doublonnage" ou pas.

    Ainsi le buffer issu de la sérialisation des structures me permet de tester structure à structure l'égalité de ces blocs.

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

Discussions similaires

  1. [WD16] Indirection sur un tableau de structure
    Par e.haefele dans le forum WinDev
    Réponses: 6
    Dernier message: 26/10/2011, 11h44
  2. Pointeur sur un tableau de structures
    Par klakman dans le forum Débuter
    Réponses: 7
    Dernier message: 28/09/2009, 11h06
  3. Réponses: 8
    Dernier message: 17/09/2008, 12h11
  4. Réponses: 1
    Dernier message: 29/06/2007, 15h13
  5. Réponses: 2
    Dernier message: 12/05/2007, 01h57

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