Copier une String dans une Structure et vice versa

Signaler
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
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

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
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)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
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)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
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]
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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 ];
}
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
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)
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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 ?