Copier une String dans une Structure et vice versa

skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 24 juil. 2007 à 15:07
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 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 ?

J'ai trouvé cet article très intéressant qui semble répondre au deux première questions :
http://www.codeproject.com/csharp/gil_structs.asp

Me je ne sais toujours pas répondre à la troisième.

Si vous avez ou connaissez d'autres méthodes, n'hésitez pas à m'en faire part.

Merci d'avance et bonne journée.

7 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
24 juil. 2007 à 15:46
Hello,

Je vais essayer de répondre à tes questions :

1/ Crée une structure en C#

public struct T_ENTETE
{

private String
_codEnr;

private String
_numEnr;

private String
_cdEmet;

public

String
CodEnr
{

get {
return
_codEnr; }

set
{

if (
value.
Length != 2)

   throw
new
Exception(
string.
Format(
"CodEnr.Length must be 2.",
VALUE_LENGTH,
value.
Length));

_codEnr =
value;
}

}

...

2/ Avec une méthode comme par exemple :

private const int TOTAL_LENGTH = 11;

public void SetValue(
string
value)
{

if (
value.
Length !=
TOTAL_LENGTH)

   throw new Exception(
string.
Format(
"Value.Length must be {0} and not {1}",
TOTAL_LENGTH,
value.
Length));

_codEnr =
value.
Substring(0, 2);

_numEnr =
value.
Substring(2, 6);

_cdEmet =
value.
Substring(8, 3);
}
3/ Surcharge la méthode ToString de ta structure :
public

override string ToString()
{

return string.
Format(
"{0}{1}{2}",
_codEnr,
_numEnr,
_cdEmet);
}

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
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)
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 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.
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 41
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 ];
}
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
25 juil. 2007 à 08:27
Hello,

Pour la question trois, par contre, je pense que la meilleure méthode est tout de même de surcharcger la méthode ToString.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
26 juil. 2007 à 22:39
Merci, je vais regarder du côté du code unsafe.

Sinon SharpMao, quel sorte de code mettrais-tu dans la fonction de surcharge de la méthode ToString ?
0
Rejoignez-nous