AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array: C vs Delphi

Ein Thema von Mithrandir · begonnen am 2. Dez 2009 · letzter Beitrag vom 3. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

Array: C vs Delphi

  Alt 2. Dez 2009, 19:47
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:
unsigned char *data_buf;
data_buf ist ein Zeiger vom Typ "unsigned char". Das entspräche:

fDataBuffer : PByte; Nu' is es aber so, dass man auch Felder in C so darstellen kann. Und dann wäre das Äquivalent in Delphi:

fDataBuffer : Array of Byte; Ich vermute fast, dass es sich um ein Feld handelt, denn im Verlauf des Quelltextes taucht dieses Konstrukt auf:

Code:
ZeroMemory(data_buf, 28);
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?

P.S.: Bei data_buf handelt es sich um einen Parameter für eine Struktur einer Windows API-Funktion, Delphi-Referenz durchsuchenDeviceIOControl
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#2

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 20:00
ZeroMemory übernimmt nichts ... das weiß nichtmal, daß es ein Array ist

besser
ZeroMemory(@data_buf[0], 28); oder du arbeitest mit einem statischen Array

Delphi-Quellcode:
TDataBuffer = Array[0..27] of Byte;
PDataBuffer = TDataBuffer;

fDataBuffer : PDataBuffer;
oder direkt
fDataBuffer : TDataBuffer; und dann überall das @ nicht vergessen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 20:05
Code:
unsigned char *data_buf
das ist ein Pointer auf einen unsigned char.
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:
void yourfunction(unsigned char data[]);
void yourfunction(unsigned char *data);
innerhalb der Funktion kann man in beiden Fällen mit
Code:
data[i]
auf ein Element zugreifen. Es ist also reine Geschmackssache wie man die Function declariert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 20:09
Zitat von himitsu:
oder du arbeitest mit einem statischen Array
Geht nicht, da es in diversen anderen Funktionen andere Größen und Werte annehmen kann. Daraus schließe ich jetzt, dass Delphi nicht ohne SetLength kann, oder?

@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... Und nur, weil der Compiler was mit sich machen lässt, heißt das ja nicht, dass es richtig ist...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#5

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 20:21
eine fast korrekte Übersezung wäre
Delphi-Quellcode:
TDataBuffer = Array[0..0] of Byte;
PDataBuffer = TDataBuffer;

fDataBuffer : PDataBuffer;
hier müßte man dann per GetMem genügend Speicher reservieren und könnte es wie ein Array ansprechen

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#6

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 20:27
Zitat von himitsu:
aber irgendwo müßte doch in C die größe des "Arrays" definiert werden?
ARGH...

Gefunden:

Code:
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...

Also wäre dein letzter Vorschlag das "Fast" - Äquivalent dazu, oder?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 21:45
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

Die vernünftige Delphi-Like Übersetzung wäre dann
Delphi-Quellcode:
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);
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.

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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#8

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 21:56
Zitat von Medium:
Dat tolle is, unter C weisst du nicht wie lang ein Array ist, wenn du es dir nicht selbst merkst.
Ja, das hab ich auch schon gemerkt. Unser Prof lässt uns gerade wild mit Pointern herumschießen...

Zitat von Medium:
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
Ja, die 64k werden tatsächlich nachher als Puffer genutzt. Die Struktur, die in diesem Beispiel das mit 28 Byte genullte Feld per Pointer bekommt, bekommt auch die Länge mitgeteilt. Für die Struktur sieht das also so aus, als hätte das Feld, was hinter dem Pointer steckt, nur 28 Elemente. Je mehr ich drüber nachdenke, desto "unschöner" finde ich die Herangehensweise...

Danke für Ausführungen.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Array: C vs Delphi

  Alt 2. Dez 2009, 22:09
Zitat von Daniel G:
Code:
unsigned char *data_buf;
data_buf ist ein Zeiger vom Typ "unsigned char". Das entspräche:

fDataBuffer : PByte;
Du kannst das auch in PAnsiChar übersetzen.

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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Array: C vs Delphi

  Alt 3. Dez 2009, 13:04
Zitat:
Delphi-Quellcode:
var
  DataBuf: {packed} array of Byte; // packed wenn alignment auf > 1 Byte steht
Wenn ich meiner D7-Hilfe glauben darf, ist das "packed" überflüssig/Blödsinn/falsch da "packed" nur bei Records (und Objekten) eine Auswirkung hat.
Arrays liegen immer Byte an Byte.

Oder hab ich da etwas falsch verstanden?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz