AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Von C nach Pascal überstetzen

Ein Thema von turboPASCAL · begonnen am 17. Nov 2005 · letzter Beitrag vom 18. Nov 2005
Antwort Antwort
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

Von C nach Pascal überstetzen

  Alt 17. Nov 2005, 10:05
Hi,

Ja ja, lang ist's her.

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

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;
}
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#2

Re: Von C nach Pascal überstetzen

  Alt 17. Nov 2005, 10:06
-> in C++ entspricht dem . in Delphi
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Von C nach Pascal überstetzen

  Alt 17. Nov 2005, 10:22
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Von C nach Pascal überstetzen

  Alt 17. Nov 2005, 11:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Von C nach Pascal überstetzen

  Alt 17. Nov 2005, 12:06
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Traudix

Registriert seit: 6. Mär 2005
Ort: Hannover
16 Beiträge
 
#6

Re: Von C nach Pascal überstetzen

  Alt 18. Nov 2005, 11:54
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
Suche die Herausforderung!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Von C nach Pascal überstetzen

  Alt 18. Nov 2005, 12:12
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Von C nach Pascal überstetzen

  Alt 18. Nov 2005, 16:27
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Von C nach Pascal überstetzen

  Alt 18. Nov 2005, 19:31
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Von C nach Pascal überstetzen

  Alt 18. Nov 2005, 19:55
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.ä.)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:51 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