mikrocontroller.net

Forum: PC-Programmierung Hilfe zu C#


Autor: Gerhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
   }

Autor: Gerhardt (Gast)
Datum:

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

Autor: Gerhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.