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 :

Affectation par référence d'une variable de type structure [WD21]


Sujet :

WinDev

  1. #1
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut Affectation par référence d'une variable de type structure
    Bonjour,

    je cherche à affecter une variable par référence, cette variable est de type structure.

    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
    ST_MaStructure est une Structure
    	Code est une chaîne
    	Texte est une chaîne
    	Tab2 est un tableau de ST_UneAutreStructure
    FIN
     
    tab est un tableau de ST_MaStructure 
     
    monObjet est un ST_MaStructure dynamique = allouer un ST_MaStructure 
     
    TableauAjouteLigne(tab)
    //monObjet = allouer un ST_MaStructure 
    //test est un ST_MaStructure = allouer un ST_MaStructure 
     
    monObjet <- tab[TableauOccurrence(tab)] // Déclenche une exception
     
    monObjet.Code = "toto"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Que s'est-il passé ?
    Impossible d'affecter l'élément.
     
    Code erreur : 1149
    Niveau : erreur fatale

    J'ai déjà fait fonctionner l'affectation avec des tableaux de structure, des objets de classe, mais là je n'arrive pas à le faire fonctionner avec des variables de type structure.

    edit : objet remplacé par monObjet

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    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 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Je ne comprends pas très bien la logique de ce code.
    Tu commences par allouer une structure dans la variable "objet"*
    Ensuite tu redimensionnes ton tableau
    Enfin tu écrases ta variable objet avec le premier élément du tableau.

    A quoi sert l'allocation ?

    Sinon Est-ce que tu as essayé avec un tableau de structure dynamique, vu que "objet" est une structure dynamique ?

    Tatayo.

    *: il me semble que objet est un mot réservé...

  3. #3
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour

    "objet" est bien un mot réservé, il désigne la classe en cours

    http://doc.pcsoft.fr/fr-FR/?1511008

  4. #4
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par ToxiK Voir le message
    Bonjour,

    je cherche à affecter une variable par référence, cette variable est de type structure.

    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
    ST_MaStructure est une Structure
    	Code est une chaîne
    	Texte est une chaîne
    	Tab2 est un tableau de ST_UneAutreStructure
    FIN
     
    tab est un tableau de ST_MaStructure 
     
    objet est un ST_MaStructure dynamique = allouer un ST_MaStructure 
     
    TableauAjouteLigne(tab)
    //objet = allouer un ST_MaStructure 
    //test est un ST_MaStructure = allouer un ST_MaStructure 
     
    objet <- tab[TableauOccurrence(tab)] // Déclenche une exception
     
    objet.Code = "toto"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Que s'est-il passé ?
    Impossible d'affecter l'élément.
     
    Code erreur : 1149
    Niveau : erreur fatale

    J'ai déjà fait fonctionner l'affectation avec des tableaux de structure, des objets de classe, mais là je n'arrive pas à le faire fonctionner avec des variables de type structure.
    Bonjour,
    J'ai eu le même problème
    J'ai essayé de faire une prise de référence sur une structure avec (<-) mais ça plante, quant à l'utilisation de (<=) ne plante pas mais ne fais pas la prise de référence.
    Erreur : Impossible d'affecter l'élément.
    Le code explicatif
    Pièce jointe 209464


    Voici la réponse du support technique

    Effectivement l'opérateur n'est pas adaptée à des variables structurées :
    http://doc.pcsoft.fr/fr-FR/?1515003

    Une suggestion en ce sens a été transmise à notre équipe Développement. J'espère que les implémentations nécessaires pourront être planifiées rapidement.

    Dans l'immédiat il faut utiliser l'opérateur pour vos instances de classes, ou les rendez-vous/tâches des plannings et diagrammes de Gantt.


    Donc ce n'est pas possible ni dans la 20 ni dans la 21, il faut faire autrement, peut être variable composé ?

    P.S : il y a une erreur dans ton code objet est un mot réservé.

    Cordialement

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    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 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Vous pouvez aussi utiliser des classes au lieu de structure, la prise de référence est sensée fonctionner dans ce cas.

    Tatayo.

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour

    Il s'agit de nouveau d'un problème de vocabulaire et d'un manque de rigueur dans l'utilisation de la nomenclature ... dans le chef de PCsoft, qui finit par nous induire en erreur.
    En conséquence de quoi, j'ai aussi été piégé à mes débuts par cette notion de variable de type avancé.
    La page de documentation consacrée à la Structure (Type de variable) est un exemple du genre.
    De mémoire, c'est là que j'ai découvert - à mes dépens - la notion de type avancé dans Windev ... !

    Au fur et à mesure qu'on découvre un langage, on commence a priori par travailler avec des variables banales, simples, puis plus avancées avant de passer aux variables vraiment plus spécifiques ou nouvelles que PCsoft introduit au fur et à mesure des versions.
    Donc, dans le cadre de la découverte des structures et des variables composées, on tombe notamment sur la page de doc consacrée à la Structure (Type de variable).

    Dans les remarques, on trouve un paragraphe traitant des types "avancés" :
    Quels types "avancés" peuvent être membre ?
    Une variable "avancée" peut être membre d'une variable "avancée". Le tableau ci-dessous présente les différentes combinaisons :
    On en déduit - peut-être un peu rapidement, mais il n'est pas toujours aisé de décrypter la doc - que les variables traitées dans ce tableau (soit les variables composées, structures, objets et tableaux) sont considérées comme des types avancés.
    A la relecture et à la lumière de problèmes du genre de celui qui nous préoccupe, on remarque qu'il est écrit "avancés" entre guillemets.
    On se dit donc qu'il y aurait peut-être une restriction sémantique dans cette formulation.

    Mais alors, que conclure du paragraphe suivant consacré au passage d'une structure en paramètre :
    Passer une structure en paramètre à une procédure
    Une variable de type "structure" peut être passée en paramètre à une procédure. Pour cela, utilisez la syntaxe suivante :
    "Structure" est aussi utilisé entre guillemets alors qu'il s'agit vraiment des structures dans ce cas.

    Pour enfoncer le clou, il faut relever plus haut sur la page, le paragraphe consacré au type admissible pour les membres d'une structure.
    On y utilise à trois reprises le terme avancé sans guillemets ce coup-ci.
    Type des membres d'une structure
    Les membres d'une structure peuvent être de type :

    Entier (ou sélectionné parmi les entiers avancés).
    Réel (ou sélectionné parmi les réels avancés).
    Monétaire.
    Chaîne (ou sélectionné parmi les chaînes avancées)....
    Ceci en parfaite contravention avec la définition officielle des Type avancés, sur laquelle on finit par tomber.

    Sans doute faut-il considérer ces pratiques comme une sorte de prime à l'ancienneté.

  7. #7
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Bonjour,
    Merci pour ces explication , mais peut être je suis un peu bête , je ne vois pas la résolution du problème ?!

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    l'excellent Tatayo a dit :
    Vous pouvez aussi utiliser des classes au lieu de structure, la prise de référence est sensée fonctionner dans ce cas.
    En effet une classe ressemble à une structure si on ne prend que ses membres.
    Si l'on crée une classe St_MaStructure avec comme déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ST_UneAutreStructure est une structure
    Code est un entier 
    Nom est une chaîne	
    FIN
     
    St_MaStructure est une classe
    	Code est une chaîne
    	Texte est une chaîne
    	Tab2 est un tableau de ST_UneAutreStructure
    FIN
    avec ce code, il semblerait que l'affectation par référence fonctionne alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MonTableau est un tableau de St_MaStructure 
    MonObjet est un St_MaStructure
    TableauAjouteLigne(MonTableau)
     
    MonObjet <- MonTableau[TableauOccurrence(MonTableau)] 
    MonObjet.Code = "toto"
    Trace (MonTableau[TableauOccurrence(MonTableau)].Code)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Bonjour,
    Donc ça serait mieux d'avoir un classe qui englobe les structures utilisées dans le projet !

  10. #10
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    Merci à tous pour vos réponses,

    je voulais être sûr qu'on ne puisse pas faire cela avec les structures avant de déclarer une classe.

    Je ne savais pas qu'on pouvez déclarer une classe à la volée, merci pour l'info jurassic pork.

  11. #11
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    Selon la documentation les tableaux, à la différence des tableaux associatifs sont considérés comme des types simples par le WLangage.
    En conséquence, les prises de références ne fonctionnent pas avec les structures et l'opérateur <-.
    J'ajoute que si le type de départ est un tableau dans une hiérarchie de structure (tableau de tableau de tableau... assossiatifs ou pas), les prises de références par '<-' ne fonctionnent pas sur tous la hiérarchie (il y a un héritage du problème).

    il existe cependant une solutions de contournement : écrire une procédure qui "donne" l'élément (à encapsuler).

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    ST_UneStructure est une structure
    Code est un entier 
    Nom est une chaîne	
    FIN
     
    tabStructure est un tableau de ST_UneStructure
     
    // Alimentation du tableau
    stStructure est un ST_UneStructure
    stStructure.Code = 1
    stStructure.Nom = "Nom"
    TableauAjoute(tabStructure,stStructure)
    ...
     
     
    // Fonction pour obtenir une prise de référence (encapsulée dans Positionne)
    // tabStructure : ENTREE tableau dont ou souhaite obtenir le ième élément en référence
    // i : ENTREE indice de l'élément à obtenir
    // Sortie non typée car soit null soit ST_UneStructure
    FONCTION StructureDonne(tabStructure est un tableau de ST_UneStructure, i est un entier)
    SI 1<= i <=  _et_ tabStructure..Occurrence ALORS RENVOYER tabStructure[i] // tada !
    Renvoyer null // pas de référence en dehors du tableau
     
    // Fonction pour se positionner dans le tableau et récupérer l'élément en référence
    // tabStructure : ENTREE tableau dont ou souhaite obtenir le ième élément en référence
    // i : ENTREE indice de l'élément à obtenir
    // stdStructure : SORTIE structure dynamique (pointeur vers le ième élément)
    FONCTION TabStructurePositionne(tabStructure est un tableau de ST_UneStructure, i est un entier, stdStructure est un ST_UneStructure = null) : Booleen
    stdStructure = null // lâche une référence précédente 
    stdStructure = StructureDonne(tabStructure,i) // Ici stdStructure est allouée en prise de référence si i appartient au tableau
    Renvoyer (stdStructure<>null )
     
    // Usage
     
    stdStructure est un ST_UneStructure dynamique
    SI TabStructurePositionne(tabStructure,1,stdStructure) ALORS 
       Info(stdStructure.Nom) // Affiche bien "Nom"
       stdStructure.Nom = "NouveauNom"
       Info(TabStructure[1].Nom) // Affiche bien "NouveauNom" CQFD !
     
       // attention libérer la structure dynamique va supprimé l'élément en référence ! L'affectation à null coupe simplement la liaison.
       stdStructure = null
    FIN
    Cette méthode fonctionne effectivement mais je ne vous la recommande absolument pas.
    Le WLangage gère correctement les prises de références sur les objets alors autant utiliser une classe à la place d'une structure.
    En outre, si vous souhaitez encapsuler un comportement, le travail sera déjà réalisé.

  12. #12
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    Après test il n'est pas possible de déclarer une classe à la volée:

    Une classe ne peut pas être déclarée en dehors d'un code de déclaration de classe classe.
    C'est dommage car je n'avais besoin de cette structure/classe dans une seule fenêtre.

  13. #13
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Que voulez-vous faire exactement ?
    Une copie (<=) ne peut pas vous aider ?

    S'il s'agit de travailler avec des membres qui n'ont pas été déclarés dans votre objet, vous pouvez essayer avec les variants puisque vous êtes en WD21.
    En principe (pas encore testé, je suis en 18), depuis WD19, les variants supportent des sous-éléments nommés qui sont créés automatiquement lors de leur affectations s'ils n'existent pas.
    Donc, une copie de votre structure vers un variant vous fournirait une variable intermédiaire de même organisation que votre structure.
    Il suffit apparemment de déclarer un variant 'générique' et ensuite de lui affecter votre structure.

    Hemgé

  14. #14
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    Je parcours des tableaux d'éléments (donc ici des objets) et de sous éléments (tableau d'entêtes qui contient des lignes), sur lesquels je j'effectue des tests et je modifie certaines propriétés si besoin.

  15. #15
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    moi non plus je n'ai pas pu déclarer une classe à la volée avec ma version jurassique de windev (16). J'ai été obligé de déclarer la classe par le volet des classes.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  16. #16
    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,


    Il n'est pas possible de déclarer une classe n'importe où, même en version 21, et c'est ce qui rend la POO si pénible dans WinDev, et donne tout son intérêt aux structures.

    Ensuite, l'affectation par référence fonctionne sur les structures, puisque vous avez pu déclarer une structure "dynamique" !

    Explication :
    - Une déclaration avec le mot clé "dynamique" implique que l'opérateur "=" sera équivalent à "<-"
    - Une déclaration sans ce mot implique que l'opérateur "=" sera équivalent à "<="

    Il manque des opérateurs sur les structures, notamment <- et <=>, mais l'opérateur =, lui, existe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ST_Toto est Structure
    	nToto est entier
    FIN
     
    stToto	est ST_Toto				= [1]
    pstTiti	est ST_Toto dynamique	= stToto
    stTata	est ST_Toto				= stToto
     
    Trace(stToto.nToto, stToto.nToto)	// 1 1
    pstTiti.nToto = 2
    Trace(stToto.nToto, pstTiti.nToto)	// 2 2
    stTata.nToto = 3
    Trace(stToto.nToto, stTata.nToto)	// 2 3
    PS. N'hésitez pas à réclamer une implémentation de l'opérateur <- et une correction de l'opérateur <=> pour les structures au Support Technique de PC Soft. Plus on sera nombreux à le faire...

  17. #17
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par Hibernatus34 Voir le message
    Bonjour,




    PS. N'hésitez pas à réclamer une implémentation de l'opérateur <- et une correction de l'opérateur <=> pour les structures au Support Technique de PC Soft. Plus on sera nombreux à le faire...
    Bonjour,
    C'est déjà fait, il y a une suggestion au niveau du S.T de PcSoft.
    Autre solution, est-il possible de contourner le problème en utilisant une variable composée ?

  18. #18
    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
    Non, par définition une variable composée n'est pas référençable, puisque son type n'est pas nommé.

  19. #19
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je déterres cette discussion car je suis en WD19 et j'ai besoin de concaténer des tableaux de structure avec prise de référence.

    J'ai trouvé une solution pour arriver à mes fins mais elle ne me convient pas complètement.

    En vue d'une éventuelle mise à jour de WD, est ce que WD22 ou WD 23 permet d'utiliser "<-" avec des lignes de tableaux de structure pour faire de la prise de référence ?

    Merci d'avance pour vos retours

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

Discussions similaires

  1. Initialisation d'une variable de type Structure
    Par callofduty dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/02/2014, 10h04
  2. Réponses: 2
    Dernier message: 31/10/2007, 15h40
  3. Réponses: 11
    Dernier message: 19/07/2007, 10h56
  4. Réponses: 6
    Dernier message: 29/04/2006, 20h37
  5. affecter une variable de type stringstream
    Par sorari dans le forum SL & STL
    Réponses: 3
    Dernier message: 24/03/2005, 11h14

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