Und zwar weiss ich nun nicht wie ich diese C Schnippsel in C# realisieren kann. Der Visual Studio 2003.NET C# Compiler mekert bei "uint byte[8]" sowie bei "struct message_write *ptransmit". Was müsste ich unter C# ändern fdamit dies funktioniert? Unter C funktioniert es prima. Ich weiss halt nicht genau wie ich das uint Array sowie Strukturübergabe in einer Funktion in C# verwirklichen kann. public struct message_write { uint id; uint rtr; uint dlc; uint byte[8]; } public void canmessage_write(struct message_write *ptransmit) { uint id_1,id_2,id_3; uint id_1_hilf,id_2_hilf,id_3_hilf; uint trdscr_wert; uint i; id_3=(ptransmit->id)&0x0f; id_2=((ptransmit->id)/16)&0x0f; id_1=((ptransmit->id)/256)&0x0f; id_1_hilf=id_1*32; id_2_hilf=id_2*2; id_3_hilf=id_3/8; trdscr_wert=(id_1_hilf)|(id_2_hilf)|(id_3_hilf); canreg_write(10,trdscr_wert); id_3=(ptransmit->dlc)&0x0f; id_2=(ptransmit->rtr)*16; id_1=((ptransmit->id)&0x0f)*32; trdscr_wert =(id_3)|(id_2)|(id_1); canreg_write(11,trdscr_wert); for (i=0;i<=7;i++) { canreg_write (12+i,ptransmit->byte[i]); } canreg_write (1,0x01); //Sendung auslsen do {} while (((canreg_read(2))&0x08)==0); }
Ich komme da nicht dahinter wie ich die in C# umsetzen kann. 1. das mit dem Array in der Struktur funzt nicht so in C# 2. der Zeiger auf die Struktur funzt bei der Funktion canmessage_write auch nicht. Wenn mir da jemand helfen könnte, wäre ich sehr dankbar.
der Punkt 2. funktioniert jetzt, hab dies so realisiert: public void canmessage_write(message_write ptransmit) { ... id_3=(ptransmit.id)&0x0f; ... } Nur noch ein Problem habe ich, das ist der Punkt 1. Wie kann ich in einer Struktur ein Array festlegen ? public struct message_write { public int id; public int rtr; public int dlc; public int[] bytes = new int[8]; } Wenn ich dies so mache dann erscheint folgende Meldung: error CS0573: 'Can.message_write.bytes': Instanzenfeld-Initialisierung kann nicht in Strukturen sein
Ich denke eine gute Einführung in C# wäre das Beste für dich. C# ist nunmal nicht C++
Wenn das Layout der Struktur nicht wichtig ist, reicht es aus dem struct ein class zu machen. Wird das Layout der Struktur dagegen irgendwo benötigt, muss auch das festgelegt werden. [StructLayout(LayoutKind.Explicit)] struct message_write { [FieldOffset(0)] uint id; [FieldOffset(4)] uint rtr; [FieldOffset(8)] uint dlc; [FieldOffset(12)] [MarshalAs(UnmanagedType.U4, SizeConst = 8)] uint[] bytes; } Für das Array ist es unter Net1.x einfacher, nur das erste Element anzugeben und den Rest über Pointerarithmetik zu machen (dann mit Vorgabe der Strukturgröße [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 20)]) Mit Net2.0 reicht [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct message_write { public int id; public int rtr; public int dlc; fixed int bytes[8]; } p.s. da structs normalerweise per value übergeben werden und nicht wie Klassen per reference, sind u.U. weitere Änderungen am Code nötig.
public struct bla { private byte[] testarray; public Bla(Anzahl) { //testarray mit Anzahl initialiesieren } } das geht so, beim instanziieren musst du dann den Konstruktor aufrufen bla Objbla = new bla(5); Ohne Gewähr, grad so ausm Kopf abgetippt. Marcus
Was mir noch auffällt, du arbeitest sehr viel mit unsigned 32bit Werten (uint), meines Erachtens sollte das Array doch eher so aussehen: private byte[] message; Marcus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.