Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Von C nach Pascal überstetzen (https://www.delphipraxis.net/57206-von-c-nach-pascal-ueberstetzen.html)

turboPASCAL 17. Nov 2005 09:05


Von C nach Pascal überstetzen
 
Hi,

Ja ja, lang ist's her.

Wie ist das zu verstehen, ich meine ist das ein Pointer "->" also memfile.pos ? :gruebel:

Code:
int memread(void *buffer, int size, unsigned int handle)
{
   MEMFILE *memfile = (MEMFILE *)handle;

   if (memfile[color=#ff0000]->[/color]pos + size >= memfile->length)
      size = memfile[color=#ff0000]->[/color]length - memfile->pos;

   memcpy(buffer, (char *)memfile[color=#ff0000]->[/color]data+memfile[color=#ff0000]->[/color]pos, size);
   memfile->pos += size;
   
   return size;
}

chrisw 17. Nov 2005 09:06

Re: Von C nach Pascal überstetzen
 
-> in C++ entspricht dem . in Delphi

turboPASCAL 17. Nov 2005 09:22

Re: Von C nach Pascal überstetzen
 
Ok, Danke.

Nur noch schnell eine letzte Frage, ist die Übersetzung folgender Strucktur richtig ?

C++
Code:
typedef struct
{
   int length;
   int pos;
   void *data;
} MEMFILE;
Delphi/Pascal
Delphi-Quellcode:
type
  TMemFile = record
    Length: Integer; {oder Cardinal}
    Position: Integer; {oder Cardinal}
    Data: Pointer;
  end;

  PMemFile = ^TMemFile;
// Edit, ok stimmt so. Hat sich erledigt.

Robert Marquardt 17. Nov 2005 10:29

Re: Von C nach Pascal überstetzen
 
Genaugenommen entspricht "->" "^." in Delph, also Pointer dereferenzieren und Element in Record ansprechen.
Die Uebersetzung der Struktur ist korrekt, aber der originale Typ Integer ist nicht ideal.
Ein Size-Element darf nicht negativ werden und Position ist sicherlich relativ zu Size und kann daher auch nicht negativ werden.
Cardinal ist daher der bessere Typ. Es steht aber zu befuerchten das die Algorithmen nicht auf unsigned-Arithmetik ausgelegt sind und dann Fehler produzieren.

Beliebter Fehler in Delphi:
Delphi-Quellcode:
var
  I: Cardinal;
  List: TStringList;
begin
  ...
  for I := 0 to List.Count - 1 do
    ...
Der obige Code kracht wenn die Liste leer ist.

turboPASCAL 17. Nov 2005 11:06

Re: Von C nach Pascal überstetzen
 
Danke für die Bestätigung.

Zitat:

Cardinal ist daher der bessere Typ.
Jup, habe ich mich also richtig entschieden, da ich den Interger durch Cardinal ersetzt habe.

Traudix 18. Nov 2005 10:54

Re: Von C nach Pascal überstetzen
 
Hallo!

Da ich grad bissl stöbere, hab ich das hier entdeckt.

Ich verstehe nicht ganz. Welcher Typ aus dem C/C++ Quelltext wird in Pascal duch Cardinal ersetzt?

Das mit den Pointern ist mir dagegen soweit klar. Der '*' hineter der Typangabe heißt soviel wie ^Typ. Und '->' entpricht '^.'. Die Punktschreibweise bei Delphizeigern gilt letztlich nur bei Klassen:

Delphi-Quellcode:
type
 TMyClass=class
 private
   FMyProperty: Integer
 public
   property MyProperty: Integer read FMyProperty write FMyProperty;
 end;

var MyClass: TMyClass;

...

   MyClass.MyProperty := 1; //--- In C++ -> MyClass->MyProperty

...
Der TYP MEMFILE* scheint ein Zeiger auf eine solche Klasse zu sein.
Die Variable *Buffer würde ich als Pointer nachbilden.

Oder ist genau hier Cardinal besser im Sinne der Frage?

Traudix

Robert Marquardt 18. Nov 2005 11:12

Re: Von C nach Pascal überstetzen
 
MEMFILE ist wie angegeben ein Record und keine Klasse.
Es enthaelt die Elemente Length, Position und Data.
Im C-Original sind Length und Position Integer, aber sollten besser Cardinal sein.
Es geht darum das eine Laengenangabe naturgemaess nur positiv sein kann, da ein Stueck Speicher keine negative Laenge haben kann.
Position hat offensichtlich den Wertebereich von 0 bis Length und sollte daher auch Cardinal sein.

Der_Unwissende 18. Nov 2005 15:27

Re: Von C nach Pascal überstetzen
 
Zitat:

Zitat von Robert Marquardt
Im C-Original sind Length und Position Integer, aber sollten besser Cardinal sein.

Geb zwar Robert Marquardt total recht, sinnvoller ist es ein Cardinal zu verwenden, aber halt auch nur wenn man selbst die Struktur entwirft. Wenn du mit einer bestehenden Struktur arbeitest, sieht das leider schon anders aus. Ich weiß nicht genau, ob du einfach das Programm komplett übersetzt, aber ein Problem das du bekommen könntest wären halt negative Zahlen. Wenn du also z.B. Längen mit -1 initialisierst (dummes Beispiel ausser du prüfst nicht den Typ), dann hast du schnell ein Problem. Aber halt auch, wenn negative Zahlen als Fehlercodes verwendet werden.
Ohne Frage ist es Schwachsinn die Fehlercodes in dieses Struct zu schreiben, aber es kann halt sein, dass jmd. genau das gemacht hat. Wollte auch nur warnen, wie gesagt Cardinal ist ohne Frage besser

Robert Marquardt 18. Nov 2005 18:31

Re: Von C nach Pascal überstetzen
 
Viel boeser ist es wenn man wie erwaehnt die Algorithmen uebernimmt und diese auf Integer ausgelegt sind.
Da kann es lustige Arithmetikprobleme geben. Die ueberwiegende Menge der aktuellen Angriffe basiert auf solchen Arithmetikfehlern
bei den Programmierern sehr beliebt sind. Man entwirft den Algorithmus halt oft nur so das er nur funktioniert wenn man ihn nicht missbraucht.

Der_Unwissende 18. Nov 2005 18:55

Re: Von C nach Pascal überstetzen
 
Zitat:

Zitat von Robert Marquardt
Viel boeser ist es wenn man wie erwaehnt die Algorithmen uebernimmt und diese auf Integer ausgelegt sind.
Da kann es lustige Arithmetikprobleme geben.

Gut, aber das Problem habe ich doch generell bei fehlender Bereichsprüfung. Bin mir einfach mal sicher, dass ein TMemFile mit einer falschen Position, Position >> Length(Data). (ihr versteht schon wie ich das meine, kein Bit-Shift sondern viel größer und length(Data) = wirkliche Länge von Data, nicht undefinierte Länge des Pointers)
Da kann ich dann genauso gut mit einem Cardinal in einem vollkommen falschen Speicherbereich springen. Dazu brauch ich doch keine Ints. Da hilft dann nur sauberes Programmieren, so dass alle Bereiche auch geprüft werden. Am besten natürlich noch eine dieser tollen neuen CPU-Schutzmechanismen und ein Compiler, der den Speicher etwas zufälliger verteilt. Erschwert zumindest die Wahrscheinlichkeit eines Buffer-Overflows (o.ä.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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