Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pointer in C# (https://www.delphipraxis.net/126241-pointer-c.html)

Neutral General 20. Dez 2008 20:24


Pointer in C#
 
Hi,

Im Moment siehts so aus, dass ich übers Netzwerk Daten geschickt bekomme. Die Socketklasse von C# (bzw dem .NET Framework) macht das ja alles über Byte-Arrays. Soweit ja in Ordnung. Allerdings will ich jetzt dieses Byte Array in ein struct kopieren, bzw das Array so interpretieren können.

Das ganze ist allerdings scheinbar nicht so einfach -.-
Ich habe keinen Move befehl o.ä. gefunden mit dem ich die Bytes einfach verschieben/kopieren kann und ein Pointer des structtyps auf dieses Array funktioniert auch nicht.

Also mein Quelltext (= Müll) sieht so aus:

Code:
public struct TPlayerState
{
   public UInt16 id;
   public int x;
   public int y;
   public UInt32 color;
}


// ...
  byte[] buff = new byte[14];
  // Daten in buff lesen
  TPlayerState* x = (TPlayerState*)(byte*)buff[0]; //<---- *
// ...
*)
Zitat:

Zeiger und Puffer mit fester Größe können nur in einem nicht sicheren Kontext verwendet werden.
Ich versteh das nicht. Abgesehn davon, dass ich bei C# Pointer noch nicht so ganz verstanden hab glaub ich.

Also
Code:
Typ* x;
=

Delphi-Quellcode:
var x: ^Typ;
Code:
x = *var;
=

Delphi-Quellcode:
x := @var;
Stimmt das soweit? Und wie dereferenziert man in C#? Und was soll wie gesagt oben diese Meldung? -.-

In Delphi ist das alles unkomplizierter.....

Insider2004 20. Dez 2008 20:27

Re: Pointer in C#
 
C# ist managed code. Da gibt es keine Pointer. Dafür gibt es native Sprachen, wie Delphi oder C.

jfheins 20. Dez 2008 20:29

Re: Pointer in C#
 
Zitat:

Zeiger und Puffer mit fester Größe können nur in einem nicht sicheren Kontext verwendet werden.
Das heißt, es ist eigentlich schlecht (das gepointere) und deshalb must du (wenn du wirklich willst) einen unsafe-Block drumherum legen ;)

Apollonius 20. Dez 2008 20:33

Re: Pointer in C#
 
Unsafe Code würde ich in .NET versuchen zu vermeiden. Es geht praktisch immer ohne. Die Frage ist hier, ob du Einfluss auf das sendende Programm hast. Wenn ja, kannst du einfach auf beiden Seiten einen Standard-Serialisierungsmechanismus verwenden (in Java gibt es so etwas, mich würde es wundern, wenn das in .NET fehlte). Andernfalls kannst du die Daten manuell aus dem Byte-Array herausziehen. Ich bin mir ziemlich sicher, dass es noch einen direkten Weg gibt (es gibt schließlich sogar Attribute für die Struct-Ausrichtung), aber er fällt mir gerade nicht ein.

Neutral General 20. Dez 2008 20:39

Re: Pointer in C#
 
Hi,

Also letztendlich ist es mir egal, wie ich die Bytes in das struct Ding bekomme -.-

Hab Einfluss auf das Sendende Programm. Es ist ein Client, den ich in Delphi schreibe.
Was ist ein Standard-Serialisierungsmechanismus?

Klar könnte ich das ganze manuell ausm Array rausziehn, aber das ist doch viel zu umständlich und wenn mein Server mal viel zu tun hat, dann ist das doch unnötige Arbeit...

Phoenix 20. Dez 2008 20:40

Re: Pointer in C#
 
Aua!

.NET ist eine managed Runtime. Da hat man nicht mit Pointern zu arbeiten. Punkt. Dadurch, dass der Speicher von der Runtime verwaltet wird, hast Du nahezu gar keine Kontrolle darüber, wie ein Struct im Speicher aussieht. Das kann sich sogar je nach dem von einem Start der Applikation zum nächsten ändern. Anzunehmen, dass ein Struct ein bestimmtes Layout im Speicher hätte, ist in .NET grundlegend falsch (Insbesondere, wenn Du in C# einfach nur 'int' nimmst. Int ist nämlich zur Zeit ein Int32, kann aber ggf. auf 64bit Systemen je nach Optimierung auch auf einen Int64 mappen). Ausnahme: Du forcierst das über Attribute, aber das unterbindet dann zwangsläufig die Optimierung und kann hintenraus ordentlich performance kosten.

Du kannst den Code möglicherweise als unsafe deklarieren, aber damit kommst Du dann spätestens bei der CAS (Code Access Security) Probleme.

Schau Dir mal den Namespace System.Runtime.Serialization bzw. System.Runtime.Serialization.Formatters an. Da hats nen BinaryFormatter. Ich denke, das wäre der bessere Ansatz um Dein Struct aus dem empfangenen Stream zu füllen.

Dax 20. Dez 2008 20:43

Re: Pointer in C#
 
Und falls du doch darauf bestehst:

Code:
[StructLayout(LayoutKind.Sequential)]
public struct TPlayerState
{
   public UInt16 id;
   public int x;
   public int y;
   public UInt32 color;
}

// unsafe void MeineMethode
// ...
   byte[] buff = new byte[14];
   fixed(byte* xb = &(buff[0])) {
    TPlayerState* x = (TPlayerState*)xb;
   }
// ...
Aber Phoenix hat schon Recht. Wenn du die korrekten Serialization-Interfaces implementierst, kannst du das wunderbar ohne rumgepointere machen. Dazu gibt's im MSDN unter den entsprechenden Topics auch viele Beispiele ;)

Neutral General 20. Dez 2008 20:44

Re: Pointer in C#
 
Mh...

Ohne Pointer ist doof. :stupid:

Mal so nebenbei... Oder sollte man einen Server, der auch auf Linux laufen soll vielleicht doch eher mit C++ schreiben?

Wenn ich mir das hier so durchlese zweifel ich langsam daran, dass C# die richtige Sprache ist...

Dax 20. Dez 2008 20:45

Re: Pointer in C#
 
Zitat:

Zitat von Neutral General
Mal so nebenbei... Oder sollte man einen Server, der auch auf Linux laufen soll vielleicht doch eher mit C++ schreiben?

Wenn ich mir das hier so durchlese zweifel ich langsam daran, dass C# die richtige Sprache ist...

Mono

Apollonius 20. Dez 2008 20:49

Re: Pointer in C#
 
Die Klassen aus System.Runtime.Serialization sind genau das, was ich mit einem Standard-Serialisierungsmechanismus meinte. Eine nicht-native Sprache benötigt schließlich auch irgendeinen Mechanismus, Objektinstanzen zu speichern, ohne dabei gleich unsafe zu werden. Bezüglich des direkten Wegs habe ich mich übrigens getäuscht. Das war eben jene Geschichte mit dem StructLayout-Attribut, und das verwendet man nur in Zusammenhang mit unsafe oder unmanaged Code.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz