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.