Hilfe zu C#

Gast #385055
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);
   }
Gast #385057
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.
Gast #385058
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
Gast #385060
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.
Gast #385061
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren