Bonjour
J'essaie depuis quelques jours d'utiliser C# de la façon suivante:
J'ai créé un type de structure de données que j'ai packé, dans le but que les données soient concomitantes. Ceci dans l'optique de pouvoir filer en référence ce tableau de données à une fonction d'une DLL.
J'instancie dans ma classe Form une structure de ce type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 [StructLayout(LayoutKind.Sequential, Pack = 1)] public unsafe struct structtest { public fixed Byte CODECUVE_TCU[6]; public UInt16 CODECLIENT_EU; public fixed UInt16 RESERVE_TEU[6]; } ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 namespace NAMESPACE { public unsafe partial class MaClasse : Form { static unsafe structtest m_MaStruct = new structtest(); } }
Lors de l'utilisation de cette structure dans une méthode de ma classe, je procède de la façon suivante:
Cette méthode me permet de pouvoir connaitre l'offset d'une donnée dans ma structure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private unsafe void MaMethode() { fixed (Byte* ptrDebut = m_MaStruct.CODECUVE_TCU) { fixed (UInt16* ptrCherche = &m_MaStruct.CODECLIENT_EU) { long adresseDeb = (long)ptrDebut; long adresseCherche = (long)ptrCherche; long Offset = adresseCherche - adresseDeb; } } }
Je butte sur l'utilisation de mon tableau de Byte, je ne sais pas comment m'en servir. (remplir, extraire un élèment..)
Quand ma structure est instancié directement dans ma méthode, il n'y a pas de souci, mais lorsqu'elle est instancié dans ma classe une erreur de complilation se produit:erreur CS1666: Vous ne pouvez pas utiliser des mémoires tampons de taille fixe contenues dans des expressions non fixed. Essayez d'utiliser l'instruction fixed.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 private unsafe void MaMethode() { structtest m_MaStruct2 = new structtest(); m_MaStruct2.CODECUVE_TCU[1] = 0; m_MaStruct.CODECUVE_TCU[1] = 0; //--> marche pas }
Est ce qu'il n'y a pas plus "simple" pour réaliser ce que je souhaite dans la mesure où je vais reproduire ce genre de calcul de façon mutliple dans mon code.
L’utilisation de mon projet a pour objectif travailler sur une table Modbus.
Je remercie les autres posts pour les explications sur l'utilisation de fixed et unsafe.
Résumé des questions:
1. Commenter utliser les tableaux fixed ?
2. Comment alléger l’utilisation d'une instance packé avec les pointeurs ?
Merci
Partager