Hej, Jeg har et problem med noget kode, der burde kopiere indholdet af en tilfældig struct over i et byte array. Problemet er at hver gang jeg bruger funktionen bliver der overskrevet noget hukommelse andet steds i programmet så dette går ned. Hvad gør jeg galt ???
Jeg var ellers under det indtryk af at det ikke var nødvendigt at rode med pointere i c# medmindre man bruger win32 API (gør du det her?). Men har du prøvet at pakke det ind i en unsafe code blok? Måske det kan hjælpe? Det er et vildt skud i tågen...
Jeg bruger ingen api kald, og har heller ikke prøvet at pakke det ind i en unsafe block. Vil det i så fald blive mere sikkert ???
Min case er at jeg har 12 forskellige structs (forskellige størrelse og type), disse skal sendes via COM porten, hvorfor jeg skal have dem konverteret til et byte array. Alternativet til den ovensstående funktion ville vel være 12 forskellige funktioner der hver i sær konverterede den enkelte struct til et byte array. Ovenstående funktion ville derfor være noget smartere (hvis den da virkede...) Findes der måske en helt anden metode ???
Det er vel smartere at lave 12 forskellige klasser, i stedet for 12 structs. Så kan du samtidigt erklære ToByteArray funktioner for hver især. Det er ihvertfald den fede OOP måde at gøre det på.
1) hvis størrelsen af struct overskrider hvad der kan være i en byte så går det galt
2) Konceptet giver mening ved int, double og lignende basale typer. Det resulterende bytes er meningsløse hvis der er string eller andre komplekse typer.
Der er kun typer at byte, ushort og int. De enkelte structs er defineret som følger: [StructLayout(LayoutKind.Sequential, Pack=1)] struct Record { public byte year; public byte month; public byte day; [MarshalAs( UnmanagedType.ByValArray, SizeConst=24 )] public ushort[] power; }
ad 1) Nogle af værdierne i f.eks. ushort overstiger 256, men ideen med ovenstående kode, er vel netop hele struct'en formateres til et byte array, som så kan "pakkes ud" i den anden ende af transmissionen.
Jeps, selve kopieringen virker fint. Mit problem er at det ser ud som om der ligeledes bliver skrevet i/frigjort et andet hukommelsesområde, så min WinForm efter et kald til denne funktion lige pludselig kommer med en exception. Det underlige er at det ikke er hver gang :-/
nope, der er et eksternt test program der læser dataene, når jeg har sendt dem via COM porten. Synes umiddelbart heller ikke der burde være noget galt med funktionen. Jeg benytter en ekstern komponent fra SAX til at sende skidtet via COM porten, det kan være jeg skal kigge lidt nærmere på den. :-/
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.