Forum: PC-Programmierung C Code in C# Code konvertieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eine bestehende Anwendung in C soll in C# konvertiert werden. Wie setzt 
man den folgenden C Code in C# um?
1
typedef uint16_t Types;
2
3
typedef struct TEST
4
{
5
    uint16_t u16Variable1;
6
    uint16_t u16Variable2;
7
    uint16_t u16Variable3;
8
}T_TEST;
9
10
static const T_TEST TEST_ZERO = { 0,0,0 };
11
12
typedef struct Header_TAG
13
{
14
    uint16_t      u16Value;
15
    T_TEST        tTEST;
16
    Types         u16Frametype;
17
    uint32_t      u32Count;
18
}Header_t;
19
20
#define HEADER ( sizeof( Header_t ) - 2 )
21
22
typedef struct
23
{
24
    Header_t tHeader;
25
    uint8_t            au8Data[ 100 ];
26
}Tele_t;

von Peter II (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Techniker schrieb:
> Wie setzt
> man den folgenden C Code in C# um?

gar nicht.

Es ist überhaupt keine code da den man umsetzen müsste.

Das sind nur ein paar typedef die man so in C# nicht verwendet. Wichtig 
ist der code der die typedef verwendet.

von Der Andere (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Indem man aus Structs Klassen macht.
Im Unterricht gepennt und jetzt brauchst du die Hausaufgabe?

von Chris F. (chfreund) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Wenn Du willst, dass es POD-structs sind, die auch so verarbeitet werden 
reicht es nicht aus wenn Du aus:
1
typedef struct
2
{
3
    Header_t tHeader;
4
    uint8_t            au8Data[ 100 ];
5
}Tele_t;
einfach folgendes machst:
1
class Tele_t
2
{
3
    Header_t tHeader;
4
    uint8_t            au8Data[ 100 ];
5
};

Das muss dann sowas in der Art werden:
1
using Microsoft.Win32.SafeHandles;
2
using System;
3
using System.Runtime.InteropServices;
4
5
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.None)]
6
        [BestFitMapping(false)]
7
        internal unsafe struct Tele_t
8
{
9
        Header_t tHeader;
10
        [MarshalAs(UnmanagedType.U1, SizeConst = 100)]
11
        string au8Data;
12
};

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Chris F. schrieb:
> Das muss dann sowas in der Art werden:

was aber nicht sehr sinnvoll ist. Man sollte keine 1:1 Umsetzung von dem 
Code machen. In C# Programmiert man etwas anders als in C.

von Chris F. (chfreund) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> Chris F. schrieb:
>> Das muss dann sowas in der Art werden:
>
> was aber nicht sehr sinnvoll ist. Man sollte keine 1:1 Umsetzung von dem
> Code machen. In C# Programmiert man etwas anders als in C.

Dann ist ja alles in Ordnung, da der TO nicht gefragt hatte ob meine 
Version der 1:1 Umsetzung sinnvoll ist, sondern wie diese aussieht. Er 
hatte auch nicht gefragt ob Code der Typdefinitionen einsetzt wichtiger 
ist als die Typdefinitionen selber (die auch Programmcode sind):

Danke, dass Du das nochmal bestätigt hast. :-)

von Techniker (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Ok vielen Dank für eure Beiträge.

von Horst (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Techniker schrieb:
> C Code in C# Code konvertieren

Wie kommt man auf so eine wahnsinnige Idee???

von Der Andere (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Chris F. schrieb:
> Dann ist ja alles in Ordnung, da der TO nicht gefragt hatte ob meine
> Version der 1:1 Umsetzung sinnvoll ist, sondern wie diese aussieht.

Nö, er hat gesagt/behauptet daß eine komplette Anwendung portiert werden 
soll.
Sowas macht man NIE 1:1 sondern portiert sinnvoll.
Allenfalls schreibt man einen Konverter der das 1:1 übersetzt, aber der 
entstehende Code ist dann unwartbar.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Horst schrieb:
> Wie kommt man auf so eine wahnsinnige Idee???

Entweder geht man von der völlig irrigen Annahme aus, dass durch die 
rein formale Konvertierung von einer Programmiersprache in eine andere 
aus einer sperrigen textbasierten Anwendung plötzlich eine bunte, schöne 
Klickibunti-App werde. Oder man kennt tatsächlich die möglichen 
Einschränkungen und muss tatsächlich recht isolierten Code, der z.B. 
bestimmte Berechnungen durchführt, übersetzen, was durchaus sinnvoll 
sein kann. In der Praxis stellt man dann aber fast immer sehr schnell 
fest, dass irgendwelche internen Datenstrukturen oder Besonderheiten 
einer Programmiersprache doch nicht so trivial zu übersetzen sind und 
größere Konzeptänderungen bedeuten. Und viel später stellt man dann 
fest, dass die Neuerstellung doch einfacher gewesen wäre.

Ich selbst hatte zu Beginn meines Studiums auch in grenzenloser Naivität 
angenommen, dass sich eine größere Sammlung von Rechenprogrammen, die in 
ALGOL 68 für eine DEC-10 geschrieben waren, mit ein bisschen lex und 
yacc in PASCAL für VAX/VMS und Turbo Pascal konvertieren ließen. Keines 
dieser Programme wurde jemals fertig.

von fpga (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es gibt sehr wohl struct auch in c#:

https://msdn.microsoft.com/de-de/library/ah19swz4.aspx

Gruß J

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Sofern diese C-Strukturen Dinge wie z.B. den Inhalt von Dateien* 
beschrieben und mit einfachen Dateioperationen als Block gelesen werden, 
wird eine Umsetzung auf das, was C# anstelle von Strukturen bietet, sehr 
interessante Nebeneffekte mit sich bringen, die mit hoher 
Wahrscheinlichkeit recht gründlich dafür sorgen, daß sich das 
"umgesetzte" Programm zu funktionieren weigert.


*) oder seriell übertragene Daten, oder per Netzwerk übertragene Daten, 
oder Daten, die als Blob aus einer Datenbank kommen, oder welchen, die 
in einem (E)EPROM gespeichert sind ... der Möglichkeiten sind viele.

von Chris F. (chfreund) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> was C# anstelle von Strukturen bietet, sehr
> interessante Nebeneffekte

Daher macht es auch Sinn hier die POD-Strukte 1:1 nachzubauen. Es geht 
offensichtlich um statische Protokollstrukturen die zur externen 
Übergabe an andere Prozesse gedacht sind.

struct ist in C++ ein class mit "default public", dort muss man schon 
mit byte-alignment aufpassen, ist aber noch gut dabei, da nativer Code 
generiert wird.

Ein C++-Compiler wird quasi immer Objektcode generieren der die Daten 
einer Instanz einer Klasse in der selben Reihenfolge wie deklariert 
speichert.

In C# kommt die volldynamische Speicherverwaltung der .net-runtime-vm 
dazu.

von Peter II (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Chris F. schrieb:
> Daher macht es auch Sinn hier die POD-Strukte 1:1 nachzubauen. Es geht
> offensichtlich um statische Protokollstrukturen die zur externen
> Übergabe an andere Prozesse gedacht sind.

es macht für mich eigentlich NIE sinn, so etwas nachzubauen weder unter 
C noch unter C#. Man macht jeweils Methoden die die interne 
Repräsentation und den Datenstrom konvertieren.

Damit kann man auch optionale Felder im Protokoll abbilden. Und es gibt 
keine Probleme wenn sich das Protokoll ändert.

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]
  • [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.