Initialisation de structure

toni93330 Messages postés 9 Date d'inscription dimanche 19 novembre 2006 Statut Membre Dernière intervention 14 février 2009 - 23 janv. 2009 à 16:44
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 26 janv. 2009 à 16:40
Bonjour,

je reviens avec d'autres problemes pour initialisé des structures.

voici les structures :

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public unsafe struct SHISDOS
        {
            public fixed sbyte numdos[ (int)typesize.LONGSIZE  ];   /*  1 : numero dossier        */
            public fixed sbyte numlig [(int)typesize.LONGSIZE ];   /*  2 : numero de ligne        */
            public fixed sbyte date[(int)typesize.LONGSIZE];     /*  3 : date                  */
            public fixed sbyte opera[(int)typesize.CHARSIZE * 8] ;    /*  4 : code operation-document */
            public fixed sbyte libell[(int)typesize.CHARSIZE * 28]; /*C_( libell[2],  28)             5 : 1..2 libelles              */
            public fixed sbyte libel2[(int)typesize.CHARSIZE * 28]; /*C_( libell[2],  28)             5 : 1..2 libelles              */
            public fixed sbyte montan[(int)typesize.DOUBLESIZE * 6];     /* 20 : 1..6 ht tva exo (Etude)
                             ht tva exo (Debou)    */
            /* 21 : montant ttc             */
            /* 29 : 1..6 ht tva exo (Etude)
       Ex. dispo ht tva exo (Debou)    */
            public fixed sbyte zondos[(int)typesize.INTSIZE];     /*  7 : no zone dossier     */
            public fixed sbyte collab[(int)typesize.CHARSIZE * 3];     /*  8 : code collaborateur    */
            public fixed sbyte typhis[(int)typesize.CHARSIZE];        /*  9 : type d'historique    */
            /*     O : Operation comptable    */
            /*     C : Courrier        */
            /*     A : Acte        */
            /*    I : Calcul d'interet    */
            /*    S : Message Serveur    */
            /*    T : appel telephonique    */
            /*    V : rendez-vous        */
            public fixed sbyte destin[(int)typesize.CHARSIZE * 10];             /* 10 : destinataire /banque    */
            public fixed sbyte gestio[(int)typesize.CHARSIZE];             /* 11 : Supp/Regu/Mult/Blanc    */
            public fixed sbyte marque[(int)typesize.CHARSIZE];             /* 12 : marquage utilisateur    */
            public fixed sbyte tpspas[(int)typesize.INTSIZE];             /* 13 : temps passe        */
            public fixed sbyte kilome[(int)typesize.INTSIZE];             /* 14 : kilometres parcourus    */
            public fixed sbyte determ[(int)typesize.CHARSIZE];             /* 15 : action determinante o/n    */
            public fixed sbyte ctitre[(int)typesize.CHARSIZE * 3];             /* 16 : code titre        */
            public fixed sbyte numfac[(int)typesize.LONGSIZE];             /* 17 : numero de facture    */
            public fixed sbyte numgrp[(int)typesize.LONGSIZE];             /* 18 : numero de groupe     */
            public fixed sbyte numtva[(int)typesize.INTSIZE];             /* 19 : indice tva              */
            public fixed sbyte datcpt[(int)typesize.LONGSIZE];             /* 25 : date de comptabilisation*/
            public fixed sbyte devise[(int)typesize.CHARSIZE];             /* 26 : monnaie: F=francs,E=euro*/
            public fixed sbyte valdev[(int)typesize.DOUBLESIZE * 3];          /* 27 : valeur devise ht,tva,exo*/
            public fixed sbyte numrec[(int)typesize.LONGSIZE];             /* 28 : numero de reçu       */
            public fixed sbyte facture[(int)typesize.LONGSIZE];             /* 31 : numero de facture       */
        }

        public unsafe struct TABLE
        {    /* structure table de l'editeur */
          char *adr;
          char *champs;
          char *namexml;
          byte typ;
          short lg;
          char *format;
         short  rang;
         char used;
        }

        public unsafe struct TFIC
        {    /* structure tableau fichier des tables pour Z1 */
          public char    *code;        
          public TABLE    *ftable;    ERREUR
          public short    indice_max; 
          public short    nfic;        /* Identificateur du fichier */
          public char    *buffer;    /* Adresse du buffer */
          public byte    type;        /* Code indiquant si type enreg. multiple */
         
      //    int    (*fonction)(LIST_ITEM **, int, XmlWriter writer,Int32, char);    /* Adresse d'une fonction specifique */
        }
        public SHISDOS hisdos;
       
        unsafe public void init()
        {
            TABLE WTHD = new TABLE();
            WTHD.adr = &hisdos.numdos;
                       
        }
la creation de TABLE WTHD est correct mais je n'est pas accés aux champs de la TABLE, comment faire et comment initialiser les champs avec la table SHISDOS ?
Merci pour votre aide

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
23 janv. 2009 à 19:42
Salut, tu as oublié le mot clé public, par defaut les champs d'une struct sont privés.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
23 janv. 2009 à 19:43
Attention aussi aux pointeurs char*, les char en C# sont codés sur 2 octets !
0
toni93330 Messages postés 9 Date d'inscription dimanche 19 novembre 2006 Statut Membre Dernière intervention 14 février 2009
24 janv. 2009 à 08:15
Bonjour,

Bon désolé, cela fait pas longtemps que je suis sur le c#

Merci
0
toni93330 Messages postés 9 Date d'inscription dimanche 19 novembre 2006 Statut Membre Dernière intervention 14 février 2009
25 janv. 2009 à 08:47
Bonjour,

Âpres avoir chercher sur le net, je ne trouve pas (ou je doit être bien nul ).

Est-il possible de faire pointer mon champs adr de la structure TABLE vers le champs numdos de la structure SHISDOS.
en C on aurait ceci :

TABLE pfic[5];
SHISDOS hisdos;
pfic[0].adr =hisdos.numdos;

Merci
 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
25 janv. 2009 à 16:58
[ StructLayout( LayoutKind.Sequential ) ]
public unsafe struct SHISDOS
{
    public fixed byte numdos[ 4 ];
}

[ StructLayout( LayoutKind.Sequential ) ]
public unsafe struct TABLE
{
    public byte* adr; // = char* C/C++
    public char* adr2; // = short* C/C++
}

public unsafe void Unfunc( )
{
    TABLE[ ] pFic = new TABLE[ 5 ];
    // Là hisdos est sur la pile,
    // il ne sera pas déplacé par le GC.
    SHISDOS hisdos = new SHISDOS( ); // ZeroMemory
    hisdos.numdos[ 0 ] = ( byte )'a';
    hisdos.numdos[ 1 ] = ( byte )'b';
    hisdos.numdos[ 2 ] = ( byte )'c';
    hisdos.numdos[ 3 ] = ( byte )'d';
    pFic[ 0 ].adr = hisdos.numdos;
    pFic[ 0 ].adr2 = ( char* )hisdos.numdos;


    MessageBox.Show( new string( ( sbyte* )( pFic[ 0 ].adr ), 0, 4 ) );
}
0
toni93330 Messages postés 9 Date d'inscription dimanche 19 novembre 2006 Statut Membre Dernière intervention 14 février 2009
26 janv. 2009 à 11:19
Bonjour,
Merci pour la réponse, j'avais essayé mais sans initialisé la structure hisdos et j'avais une erreur de compil.
Donc, si je comprend bien, on ne peut pas pointé sur une autre adresse tant que celle-ci n'est pas renseigné ?
Le new sert a quoi dans ce cas la ? car cela ne m'arrange pas .A moins d'initialisé tous mes champs de la structure hisdos avec null cela pourrait-il marché ?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
26 janv. 2009 à 16:40
C# n'autorise pas l'utilisation d'une struct avant que tous ses champs soit initialisés, 2 solutions pour ça.. initialiser chaque champ un part un ou utiliser l'opérateur new, qui contrairement au C++ ne va pas allouer de l'espace sur le tas mais simplement faire un ZeroMemory ( mettre tous ses champs à 0 ) car une struct est "un type valeur" et allouée ( ou pas ) avec new elle restera sur la pile.
0