Forum: PC-Programmierung Hilfe zu C#


von Gerhardt (Gast)


Lesenswert?

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 ausl”sen
  do
        {}
  while (((canreg_read(2))&0x08)==0);
   }

von Gerhardt (Gast)


Lesenswert?

Also mein Problem liegt hier an der Struktur.
Wie kann ich so etwas in C# machen?

von Gerhardt (Gast)


Lesenswert?

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.

von Gerhardt (Gast)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Ich denke eine gute Einführung in C# wäre das Beste für dich. C# ist
nunmal nicht C++

von arc (Gast)


Lesenswert?

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.

von Marcus (Gast)


Lesenswert?

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

von Marcus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.