Copier une String dans une Structure et vice versa
skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007
-
24 juil. 2007 à 15:07
skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007
-
26 juil. 2007 à 22:39
Bonjour tout le monde,
J'aimerais savoir comment l'on fait pour copier une chaine de caractère dans une structure mais également faire l'opération inverse.
Je m'explique. J'utilise le code suivant en Visual Basic
Public Type T_ENTETE
CodEnr As String * 2
NumEnr As String * 6
CdEmet As String * 3
End Type
Dim ms As T_ENTETE
Dim s As String
s = "00111111222"
CopyMemory ms, s, Len(s) ' Récupère la ligne dans la structure
Grace à la fonction CopyMemory de l'API Windows, je peux très facilement remplir ma structure avec le contenu de ma chaine.
L'opération n'est pas plus compliquée.
Mes questions sont les suivantes :
1-/ Comment faire pour avoir l'équivalent de ma structure VB en C# ?
2-/ Comment faire pour copier le contenu d'une chaine de caractère dans une structure ?
2-/ Comment faire pour recopier le contenu d'une structure dans une chaine de caractère ?
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 24 juil. 2007 à 16:04
Encore une chose,
Pour le point deux, il est bien sûr possible de faire la même chose dans le constructeur de la structure.
Désolé aussi, il y a eu un petit problème de mise en page sur mon précédent post, et le début du point trois est sur la fin d'une ligne de code, pas très lisible tout ça.
Amicalement, SharpMao
"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 24 juil. 2007 à 16:11
une remarque purement .net...
une structure est un type valeur et ne doit contenir QUE des types valeurs (int, double,...)
donc, string étant un type d'instance : tu dois utiliser class à la place de struct.
skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007 24 juil. 2007 à 16:48
Salut SharpMao,
Merci pour ta réponse mais ta méthode est moyennement intéressante car elle suppose de s'ennuyer à connaitre l'emplacement des différents champs.
L'intérêt du CopyMemory et que l'on a besoin de connaitre uniquement la taille de la structure.
D'ailleurs à ce sujet, j'ai trouvé un autre article intéressant qui me permet de répondre à mes question 1 et 2 avec une autre méthode (CopyMemory) que le premier article :
http://www.codeproject.com/vb/net/netcopymemorysample.asp
Si tu as une autre idée, je suis preneur.
Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 25 juil. 2007 à 06:49
Salut, la raison pour laquelle ce n'est pas si simple c'est que les chaines en C# ne sont pas inlines mais des pointeurs sur le tas.. c'est pour ça que les exemples sur CodeProject bidouillent avec [MarshalAs(UnmanagedType.ByValTStr, SizeConst=4)].
L'un des equivalent de ta struct c'est ça :
[ StructLayout( LayoutKind.Sequential ) ]
public unsafe struct Id
{
public fixed char id0[ 2 ];
public fixed char id1[ 6 ];
public fixed char id2[ 3 ];
}