Et avec cette struct ça marche pas ? (parce que j'ai pas l'impression que c'est ce que tu fais avec le code que tu dit ne pas être propre ...)
Version imprimable
Et avec cette struct ça marche pas ? (parce que j'ai pas l'impression que c'est ce que tu fais avec le code que tu dit ne pas être propre ...)
effectivement le code pas propre je l'avias écrit a la base dans l"optique de recevoir une struct avec un tableau.
Maintenant mon pb c'est que avec la manière pas propre (sans ta classe pour la réception), je n'arrive pas a détecter les int de ma nouvelle struct
c'est peut etre mon encodage en ascii, surement meme, mais je ne sais pas lequel utiliser autrement
tu es sur que ton programme C envoi de l'ASCII ?
J'avoue que je ne connais pas le codage (j'ai pas le code ici chez moi), mais je pense que il n'y a pas de codage spécifique ....
C'est une structure C qui est remplit puis envoyer sur le réseau (convertit en byte)
oui mais par exemple le char de .net est un char unicode, essayes de remplacer les char par des byte, enfin, je sais pas trop ça me parait étrange ... :?
Je pense que avec ta classe cela serai plus simple quand même ... mon pb initial était que je retrouve toujours la même valeur en utilisant ReadBlock.
Pcq passer par la technique moins propre ca nécessite de savoir, l'encodage des données etc ...
Pcq en C un caractère est codé sur 1 octet mais un entier sur 4 octets, alors bon ...
tu as une idée de pk mon code avec ta méthode ReadBlock, me renvoi plusieurs fois la meme valeur (la première recue?)
avec la méthode bourrin j'ai aucun pb pour récupérer des char, mon pb est que j'arrive pas a récupérer les int de la structure .....
Bon attend, on va reprendre tout.
Tu arrives à lire tout ce que tu veux avec la méthode bourrin ok. Sauf que là le problème ne me saute pas aux yeux.
Si tu peut fait un truc : utilise la méthode bourrin pour tout enregistrer tel quel dans un fichier. Poste ce fichier ici. Et (re)poste la structure des données que tu dois avoir.
En fait j'arrive a tout lire sauf les int en fait bref.
Ok ca roule, par contre j'aurai accès a la machine executant le code C que demain entre midi et deux. Je posterai donc ca a ce moment là.
Merci de m'aider !
En PJ, le fichier de ce que je reçois via ce code:
Ce qui m'est envoyé est une structure contenant les infos suivantes:Code:
1
2
3
4
5
6
7
8 do { indexFlux = this.client.GetStream().ReadByte(); MessageBox.Show(indexFlux.ToString()); } while (indexFlux != -1);
char typeDonnee; -> I
char car; -> O
short longueur; -> 99
int angleEpaule; -> 1
int angleCoude; -> 2
int anglePoignet; -> 3
int vitesse; -> 4
int nbOrdre; -> 5
Mais non, là tu me donnes un truc bizarre. Moi je parlais du fichier tel quel, reçu avec par exemple
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 using(FileStream f_dest = new FileStream("c:\\out.txt", FileMode.Create)) { Stream data = this.client.GetStream(); byte[] buf = new byte[16]; int i = 0; while (true) { i= data.Read(buf, 0, buf.Length); f_dest.Write(buf, 0, i); if (i <= 0) break; } f_dest.Flush(); }
Ensuite sur le même principe pour lire tes données normalement tu dois faire ça :
Code:
1
2
3
4
5
6
7
8
9
10
11 Stream data = this.client.GetStream(); byte[] buf = new byte[16]; int i = 0; while (data.DataAvailable) { la_struct_bidule current = (la_struct_bidule)StructGetter.ReadBlock(data, typeof(la_struct_bidule); /* traitement de current */ }
Ok d'accord je note ca, je testerai ca lundi et je te dirai le resultat.
Merci bcp!!!
yeah !!!!!!!!!!!!!!!!!!!!!!!
Merci nickel ca marche, désolé, du temps de réponse, j'avais pas trop eu le tps de bosser sur le projet, javais des partiels, mais en tout cas maintenant ca marche et on a fait un bon de géant dans notre projet !!!
encore un petit pb ..... ou je galère dessus
j'ai un structure de cette forme :
j'essaie d'envoyer une structure (ou plusieurs) comme ca via le réseau et la classe que tu m'as donné lève une exception à cet endroit :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 //Création des structures public struct ordreEnvoiStruct { public char typeDonnee; public char car; public short longueur; public int period; public int angleEpaule; public int angleCoude; public int anglePoignet; public int vitesse; public int nbOrdre; public double[] tabPositionEpaule; public double[] tabPositionCoude; public double[] tabPositionPoignet; }
Le message de l'exception est :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public static void GetBytes(object val, [In, Out] byte[] buffer, int offset, int bufsize) { if (val == null) throw new ArgumentNullException("val"); int size = SizeOf(val); IntPtr p = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(val, p, true); Marshal.Copy(p, buffer, offset, bufsize); //Je reajoute un catch } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { Marshal.FreeHGlobal(p); } }
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée
une idée?
Comment appelles-tu le code ?
Sinon, essayes de définir explicitement la taille de ton array :
Ou alors vu que ce sont les derniers éléments, envoi les double[] à la main en ne laissant dans le struct que des int pour savoir combien d'éléments il y a dans le flux. (La conversion double > byte[] > double est simple, regarde la classe BitConverter).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public struct ordreEnvoiStruct { public char typeDonnee; public char car; public short longueur; public int period; public int angleEpaule; public int angleCoude; public int anglePoignet; public int vitesse; public int nbOrdre; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] public double[] tabPositionEpaule; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] public double[] tabPositionCoude; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] public double[] tabPositionPoignet; }
Merci bcp pour ta réponse. Malheureusement j'ai rendu mon projet aujoud'hui et j'vais pas vu ton post hier ... mais bon c'est pas trop grave je ferai passer ta réponse a mon prof, dans le cas ou il repasse le projet l'année prochaine
Merci en tout cas