![]() |
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; } |
Re: Von C nach Pascal überstetzen
-> in C++ entspricht dem . in Delphi
|
Re: Von C nach Pascal überstetzen
Ok, Danke.
Nur noch schnell eine letzte Frage, ist die Übersetzung folgender Strucktur richtig ? C++
Code:
Delphi/Pascal
typedef struct
{ int length; int pos; void *data; } MEMFILE;
Delphi-Quellcode:
// Edit, ok stimmt so. Hat sich erledigt.
type
TMemFile = record Length: Integer; {oder Cardinal} Position: Integer; {oder Cardinal} Data: Pointer; end; PMemFile = ^TMemFile; |
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:
Der obige Code kracht wenn die Liste leer ist.
var
I: Cardinal; List: TStringList; begin ... for I := 0 to List.Count - 1 do ... |
Re: Von C nach Pascal überstetzen
Danke für die Bestätigung.
Zitat:
|
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:
Der TYP MEMFILE* scheint ein Zeiger auf eine solche Klasse zu sein.
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 ... Die Variable *Buffer würde ich als Pointer nachbilden. Oder ist genau hier Cardinal besser im Sinne der Frage? Traudix |
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. |
Re: Von C nach Pascal überstetzen
Zitat:
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 |
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. |
Re: Von C nach Pascal überstetzen
Zitat:
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 10:09 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