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

Windows Forms Discussion :

Problème de cast dans structure


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut Problème de cast dans structure
    Bonjour à tous,
    est-ce qu'il est possible de "caster" Buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim Buffer(5) as byte
     
    structure Struct
      dim p1 as byte
      dim p2 as uint16
      dim p3 as uint16
    end structure
     
    ' j ai essayé
     
    dim S as struct = CType(buffer(0), struct)
    Mais bien sûr, ça ne marche pas...
    Y a t-il une autre façon de faire ?

    Merci d'avance,

    Robert

  2. #2
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Tu ne peux pas convertir un type byte() en struct...

    Tu veux faire quoi ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut
    Bonsoir et merci...

    Je veux simplement appliquer un buffer de reception sur une structure pour recupérer des données. Dans l'exemple précédent, je voulais que le premier octet du buffer aille dans p1, les deux suivants dans p2, les deux suivants dans p3...

    J'ai aussi essayé avec l'option layout explicit et le buffer à l'offset 0, p1 offset 1, p2 offset 2... Erreur à l'exécution... mauvais alignement ou bien un objet et un "non-objet" se chevauchent. J'ai essayé de mettre le buffer et les données dans deux structures séparées, puis de réunir les deux structures dans une troisième en les alignant en 0... même erreur... je ne sais plus trop quoi essayer pour éviter de faire du saucissonnage de buffer... pour l'exemple il y a 5 octets, mais avec 100, c'est déjà plus pénible...

    Merci d'avance,

    Robert

    PS: en delphi, il y a le mot clé absolute, qui permet de placer un "truc" à la même adresse qu'un autre... c'est quand même drôlement pratique...

  4. #4
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Je n'ai pas compris, uint16 tu peux pas mettre un byte de dans....

    Et pourquoi tu passes par une structure ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim buffer(5) As Byte
            Dim p1 As Byte = buffer(0)
            Dim p2 As Byte = buffer(1) + buffer(2)
    ...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut
    Excuse moi... j'ai dû mal m'expliquer...

    Je vais reprendre à l'envers, ça sera peut-être plus clair:

    L'idée vient du Pascal et de absolute. Supposons que j'ai un buffer de réception (USB, Série... peu importe). Ce buffer représente des données diverses.
    Je déclare un record Toto (structure enVB) qui est l'image de ce que j'attends. Par exemple un byte, suivi de deux entiers sur 16 bit comme dans l'exemple précédent.

    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Toto = record
             p1 : byte
            p2  : short
            p3 : short
    end;
     
    Totoenreg : toto
    Buffer[0..4] : byte absolute TotoEnreg
    lorsque je reçois 5 octets dans totoEnreg, ils sont instantanément disponibles en tant que p1, p2, p3 sans faire p1 = TotoEnreg[0] , p2 = .... ce qui est commode quand on a un enregistrement qui représente beaucoup de champs différents...

    J'essayais de trouver un moyen de faire cette sorte de "transfert automatique" en VB.Net...

    Hum... je ne suis pas sûr d'avoir été beaucoup plus clair...

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Si j'ai bien compris, cette petite classe que je me suis bricolé il y a un moment pourrai t'être utile ( comme d'habitude, en C#, car je ne connais pas le VB.NET )
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
     
    namespace System
    {
        /// <summary>
        /// Description of StructGetter.
        /// </summary>
        public static class StructGetter
        {
            public static void WriteBlock(Stream Output, object structure)
            {
                byte[] buf = new byte[SizeOf(structure)];
                GetBytes(structure, buf, 0, buf.Length);
                Output.Write(buf, 0, buf.Length);
            }
     
            public static object ReadBlock(Stream Input, Type structure_type)
            {
                byte[] buf = new byte[Marshal.SizeOf(structure_type)];
                Input.Read(buf, 0, buf.Length);
                return GetStruct(buf, 0, buf.Length, structure_type);
            }
     
            public static int SizeOf(object structure)
            {
                return Marshal.SizeOf(structure);
            }
     
            public static void GetBytes(object val,
                                          [In, Out] byte[] buffer,
                                         int offset,
                                        int bufsize)
            {
                if (val == null)
                    throw new ArgumentNullException("val");
     
                int size = SizeOf(val);
                IntPtr p = Marshal.AllocHGlobal(size);
     
                try
                {
                    Marshal.StructureToPtr(val, p, true);
                    Marshal.Copy(p, buffer, offset, bufsize);
                }
                finally
                {
                    Marshal.FreeHGlobal(p);
                }
            }
     
            public static object GetStruct(byte[] buffer,
                                           int offset,
                                           int count,
                                           Type struct_type)
            {
                IntPtr p = Marshal.AllocHGlobal(count);
                object result = null;
     
                try
                {
                    Marshal.Copy(buffer, offset, p, count);
                    result = Marshal.PtrToStructure(p, struct_type);
                }
                finally
                {
                    Marshal.FreeHGlobal(p);
                }
     
                return result;
            }
        }
    }
    après il te suffit de faire GetStruct ou GetBytes ...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut
    Bonjour,
    ça semble très interressant en effet! Je dis semble parce que j'ai du mal à déchiffrer la syntaxe du C...
    Je vais essayer de traduire ça et voir si j'arrive à le faire fonctionner. Je peux t'appeler à l'aide si je n'arrive pas comprendre ?

    Merci d'avance,

    Robert

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Oui bien sur, je serai là

Discussions similaires

  1. Problème de sauvegarde dans une structure
    Par Invité dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/05/2008, 11h24
  2. Problème de tableau dans une structure
    Par zarbiman dans le forum Réseau
    Réponses: 5
    Dernier message: 15/12/2007, 18h21
  3. Problème de cast dans une page JSP
    Par DaSoul dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 09/10/2007, 08h56
  4. Réponses: 6
    Dernier message: 27/10/2006, 14h27
  5. Problème de rangement de structure dans un fichier ...
    Par Freeze dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/12/2003, 16h46

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