![]() |
Array: C vs Delphi
Hi ihr,
ich lerne in der FH C (nicht C++) und bin gerade dabei, ein Programm zu Lernzwecken zu übersetzen. Prinzipiell ist mir klar was das Programm macht, aber mit den internen Strukturen der beiden Compiler bin ich grad nicht so firm. Es geht um Folgendes:
Code:
data_buf ist ein Zeiger vom Typ "unsigned char". Das entspräche:
unsigned char *data_buf;
Delphi-Quellcode:
Nu' is es aber so, dass man auch Felder in C so darstellen kann. Und dann wäre das Äquivalent in Delphi:
fDataBuffer : PByte;
Delphi-Quellcode:
Ich vermute fast, dass es sich um ein Feld handelt, denn im Verlauf des Quelltextes taucht dieses Konstrukt auf:
fDataBuffer : Array of Byte;
Code:
Somit wird ab der Adresse "data_buf" ein Block von 28 Byte mit Nullen aufgefüllt. Habe ich das so richtig interpretiert? Und wenn ja, brauche ich dann bei Delphi für das dynamische Array SetLength, oder übernimmt das ZeroMemory? Oder kann ich gar mit der allerersten Deklaration als PByte arbeiten?
ZeroMemory(data_buf, 28);
P.S.: Bei data_buf handelt es sich um einen Parameter für eine Struktur einer Windows API-Funktion, ![]() |
Re: Array: C vs Delphi
ZeroMemory übernimmt nichts ... das weiß nichtmal, daß es ein Array ist
besser
Delphi-Quellcode:
oder du arbeitest mit einem statischen Array
ZeroMemory(@data_buf[0], 28);
Delphi-Quellcode:
oder direkt
TDataBuffer = Array[0..27] of Byte;
PDataBuffer = TDataBuffer; fDataBuffer : PDataBuffer;
Delphi-Quellcode:
und dann überall das @ nicht vergessen
fDataBuffer : TDataBuffer;
|
Re: Array: C vs Delphi
Code:
das ist ein Pointer auf einen unsigned char.
unsigned char *data_buf
Arrays werden in C als Pointer übergeben. Wenn man also ein Array von unsigned char hat wird nur ein Pointer auf das erste Element übergeben. folgendes ist also identisch:
Code:
innerhalb der Funktion kann man in beiden Fällen mit
void yourfunction(unsigned char data[]);
void yourfunction(unsigned char *data);
Code:
auf ein Element zugreifen. Es ist also reine Geschmackssache wie man die Function declariert.
data[i]
|
Re: Array: C vs Delphi
Zitat:
@SirThornberry: Danke, das wusste ich. :) Mir gings nur darum, ob Delphi und C Arrays Grundverschieden behandeln. Bin mir da nämlich grad nicht so sicher... :gruebel: Und nur, weil der Compiler was mit sich machen lässt, heißt das ja nicht, dass es richtig ist... :stupid: |
Re: Array: C vs Delphi
eine fast korrekte Übersezung wäre
Delphi-Quellcode:
hier müßte man dann per GetMem genügend Speicher reservieren und könnte es wie ein Array ansprechen
TDataBuffer = Array[0..0] of Byte;
PDataBuffer = TDataBuffer; fDataBuffer : PDataBuffer; 0..0 ist ohne Indexprüfung aber irgendwo müßte doch in C die größe des "Arrays" definiert werden? Das dynamische Delphi-Array hat vor den Arraydaten noch Infos die Größe und Referenzzähler, also ganz kompatibel sind C- und Delphi-Array nicht. |
Re: Array: C vs Delphi
Zitat:
Gefunden:
Code:
:stupid:
data_buf=(unsigned char *)malloc(65536);
data_buf ist in dem Beispiel eine globale Variable, der QT hat über 1200 Zeilen und die Main-Funktion ist natürlich ganz am Ende... :roll: Also wäre dein letzter Vorschlag das "Fast" - Äquivalent dazu, oder? |
Re: Array: C vs Delphi
Dat tolle is, unter C weisst du nicht wie lang ein Array ist, wenn du es dir nicht selbst merkst. Da scheint einfach mal ein "genügend" großes alloziiert zu werden (64k, yay), so dass was auch immer da mal rein schreiben wird da genug Platz für hat - WinAPI Funktionen geben oft irgendwie die Anzahl tatsächlich geschriebener Bytes zurück. Dass da dann 28 von genullt werden... tjoa, scheint wohl irgendwozu gebraucht zu werden :stupid:
Die vernünftige Delphi-Like Übersetzung wäre dann
Delphi-Quellcode:
Wobei letztlich fraglich ist, ob es sich lohnt 64k einfach mal auf Verdacht zu kapern. Sinniger erscheint mir hier nach Bedarf die Länge zu sezten.
var
DataBuf: {packed} array of Byte; // packed wenn alignment auf > 1 Byte steht begin SetLength(DataBuf, 65536); // entspricht quasi dem malloc() ZeroMemory(@DataBuf[0], 28); Arrays sind intern bei beiden Sprachen fast gleich. Bei Delphi sitzt eben vorm 0-ten Element noch ein Längen-DWord, weshalb man bei C-Array erwartenden Funktionen explizit einen Pointer auf das 0-te Element übergeben sollte. In den meisten Fällen erledigt das einfaches hinschreiben ohne @ und [0] auch, da hängt's dann davon ab wie die Funktion importiert wurde. Der Regelfall ist, dass C-Pointer einfach als typenlose Pointer übersetzt werden, wo ein @ obligatorisch wird. Möglich wäre aber wohl auch ein harter Cast "Pointer(DataBuf)". Man muss eben nur ggf. auf's Alignment achten, was wenn nicht anders dokumentiert "packed" entsprechen sollte. |
Re: Array: C vs Delphi
Zitat:
Zitat:
Danke für Ausführungen. :thumb: |
Re: Array: C vs Delphi
Zitat:
Delphi-Quellcode:
var
fDataBuffer : PAnsiChar; fDataBuffer:=Alloc(65536); // Natürlich nicht vergessen den Speicher wieder freigeben fDataBuffer^[123]:='C'; Für ein Array halte ich deine Beschreibung nicht. Sieht eher nach einen String aus. |
Re: Array: C vs Delphi
Zitat:
Arrays liegen immer Byte an Byte. Oder hab ich da etwas falsch verstanden? Gruß K-H |
Re: Array: C vs Delphi
Ein Array ist quasi ein Record, bzw. es ist viele Records hintereinander.
Aber da hier alle Elementy (das Byte) gleich groß sind, ibt es eh keine Speicherausrichtung, weswegen es am Ende hier wirklich nicht nötig ist. |
Re: Array: C vs Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr. |
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