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


von Techniker (Gast)


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)


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)


Lesenswert?

Indem man aus Structs Klassen macht.
Im Unterricht gepennt und jetzt brauchst du die Hausaufgabe?

von Chris F. (chfreund) Benutzerseite


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)


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


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)


Lesenswert?

Ok vielen Dank für eure Beiträge.

von Horst (Gast)


Lesenswert?

Techniker schrieb:
> C Code in C# Code konvertieren

Wie kommt man auf so eine wahnsinnige Idee???

von Der Andere (Gast)


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


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)


Lesenswert?

Es gibt sehr wohl struct auch in c#:

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

Gruß J

von Rufus Τ. F. (rufus) Benutzerseite


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


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)


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.

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.