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.NET Discussion :

[vb.net]initialisateur pour les membres de structure


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [vb.net]initialisateur pour les membres de structure
    bonjour,

    Je rencontre un petit soucis dans la gestion d'un tableau dynamique membre d'une structure.

    Voici ma structure de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Structure structdef
            Dim nbEmploye() As Integer = New Integer() {}
            Dim capHHebdo() As Integer
            Dim capHMensuel() As Integer
     End Structure
     
    Dim ResultatFeuille() As structdef = New structdef() {}
    Le soucis c qu'il ne semble pas possible d'initialiser une donnée de cette façon à moins qu'elle ne soit "shared".
    Voici l'erreur :

    Les initialiseurs pour les membres de structure ne sont valides que pour les membres et constantes 'Shared'.

    L'autre soucis, si je n'initialise pas mon tableau a vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Public Structure structdef
            Dim nbEmploye() As Integer
            Dim capHHebdo() As Integer
            Dim capHMensuel() As Integer
        End Structure
    Lorsque je tente de faire un Redim sur le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve ResultatFeuille(col).nbEmploye(ResultatFeuille(col).nbEmploye.Length)
    J'ai une erreur de :

    L'index se trouve en dehors des limites du tableau.
    J'ai donc modifié ma structure comme suis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Structure structdef
            Shared nbEmploye() As Integer = New Integer() {}
            Dim capHHebdo() As Integer
            Dim capHMensuel() As Integer
      End Structure
    Le soucis c qu'avec cette méthode je n'ai plus la possibilité d'avoir un tableau nbEmployé indépendant pour chaque ResultatFeuille la modification de la taille d'un seul nbEmployé, modifie tous les autres.

    Je cherche donc un moyen d'initialiser vide mon nbemployé dans ma structure puis de pouvoir le faire grandir dynamiquement au besoin.

    Je ne sais pas si ce que je cherche à faire est possible et surtout si j'ai bien exprimé mon problème.

    Si vous avez une idée je vous remercie d'avance.

    cordialement

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    faut revoir les bases, une structure ce n'est pas une classe

    sans rentrer dans les détails, fait une classe plutot qu'une structure
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    Euh je ne vois pas bien le rapport entre une classe et une structure de donnée?

    J'avoue ne pas avoir compris ta réponse.

    J'ai fait un tableau de strucdef

    et un structdef a trois données membres (je sais que c le termes utilisé en objet mais je ne connais pas d'autre terme pour définir les différents éléments composant ma strucdef.)

    Bon je continue a chercher comment gérer le redim sur un tableau composant une structure.

    cordialement

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Public Structure structdef
            Dim nbEmploye() As Integer
            Dim capHHebdo() As Integer
            Dim capHMensuel() As Integer
        End Structure
    à remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     Public Class structdef
            Dim nbEmploye() As Integer
            Dim capHHebdo() As Integer
            Dim capHMensuel() As Integer
        End Class
    enfin y a d'autres moyens de s'en sortir mais c'est le plus simple


    une structure est un type par valeur, pas besoin de faire de new dessus pour pouvoir l'utiliser
    donc pas d'initialisation possible
    il reste par contre possible de mettre un sub new dedans, et de l'appeler comme un new d'une classe
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Comme je le dis plus haut je cherche bien a utiliser une structure de donnée et non une classe.

    Je viens de reparcourir le cours de Lassere et je pense avoir trouver une piste :

    http://plasserre.developpez.com/cour...ngage-vb3#LV-J

    Je fais quelque test et je reposte.

    cordialement.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    pourquoi vouloir utiliser une structure plutot qu'une classe ??
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    J'avoue ne pas m'être poser la question dans ce sens la.

    Cependant je ne connais pas les avantages / inconvénients de la classe par rapport à la structure.

    D'après ce que j'ai compris c au niveau du passage de valeur par référence ou par valeur

    Je suis en train de lire le cour de Lasserre.

    cordialement

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    oui entre autre

    exemple de ce que ca change :

    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
     
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim a As New MaClasse ' le new est obligatoire sinon a est inutilisable
            a.membre = "test 1"
     
            Dim b As MaClasse ' là je met pas de new car je défini juste le type, on peut le remplir avec un autre MaClasse
            b = a
     
            b.membre = "modifié"
            'b et a sont des types par référence, et il références tous les 2 la même instance
            ' donc a.membre vaut "modifié"
     
            Dim x As MaStructure ' le new n'est pas obligatoire, si on le met ca fait rien de spécial d'ailleurs
            x.membre = "test 2"
     
            Dim y As MaStructure
            y = x
            y.membre = "modifié"
            'x et y sont des types par valeur, donc quand on a fait y = x, y est une copie de x
            ' ici x.membre vaut toujours "test 2" 
        End Sub
    End Class
     
     
     
    Public Class MaClasse
        Public membre As String
    End Class
     
    Public Structure MaStructure
        Public membre As String
    End Structure
    les structures sont pas très utilisées ...
    car quand tu appelles une sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sub masub (byval a as MaClasse)
    ici, le pointeur de la variable est passé (donc integer ou long selon si l'appli est en x86 ou x64)
    dans le cas d'une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sub masub (byval a as MaStructure)
    ici, toutes les variables sont recopiées
    donc si tu passes un truc avec 2 string de 20 caractères, l'appel de la sub passe 80 octets (et pas 4 ou 8 comme dans le cas d'une classe)

    de plus si dans la sub, tu modifies a.membre, en resortant la valeur reste dans le cas de la classe, mais pas dans le cas de la structure
    (vu que c'est une autre qui est passée)
    dans le cas du byref par contre la structure passée est la meme et donc y a pas 80 octets à faire passer


    les structures sont rarement utilisées, elle sont néanmoins plus performantes dans certains rares cas

    le genre de soucis posé par l'utilisation d'une structure :
    http://www.developpez.net/forums/d81...width-fenetre/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    uhm j'ai trouvé d'où venait l'erreur, mais ce n'etait pas du au tableau dans ma structure, mais à une mauvaise gestion des index de mon tableau stockant les structures.

    En fait je travaille actuellement sur l'automatisation des traitement sur un fichier excel, et je commence à faire les calculs et je stocke les résultats à afficher en fin de traitement à l'aide de ma structure.

    Je vais continuer avec ma structure mais je garde bien en tête l'utilisation possible des classes pour remplacer la structure.

    Encore merci pour ton aide et tes observations.

    Je n'ai pas encore saisit toutes les subtilités entre les classes et les structures mais ca viendra.

    Il faut que je bouffe encore un peu de code

    ++

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

Discussions similaires

  1. [MySQL] Système de votes (pour les membres) : cmt le créer ?
    Par yazerty dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 20/02/2006, 12h58
  2. [VB.NET]Problème pour les feuilles MDI
    Par Skieur38 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/02/2006, 14h10
  3. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49

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