AGB  ·  Datenschutz  ·  Impressum  







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

Typübersetzung C? <> Delphi

Ein Thema von himitsu · begonnen am 28. Okt 2012 · letzter Beitrag vom 11. Nov 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Typübersetzung C? <> Delphi

  Alt 28. Okt 2012, 00:58
Ich glaub langsam, daß man C erfunden hat, um die Programmierer um ihren Verstand zu bringen.

Nja, jedenfalls dachte ich mal, ich hätte das Prinzip verstanden, aber irgendwie lese ich grade überall was Anderes.

Ist bool denn nun Boolean/boolean oder LongBool/int?
Also in C++.


Stimmt das denn nun so?

BOOL (C) = int
bool (C++) = boolean/byte = Boolean (D)
BOOL (C++) = int = LongBool/NativeInt (D mit 32 Bit)
bool (C#) = int
bool? (C#) = nullable boolean (TRUE FALSE NULL)
boolean = Boolean (D)
BOOLEAN = ?


Es ist ja schon schlimm genug, daß man case-sensitive Systeme erfindet, aber wer soll da denn noch durchsehn?


'nen schönen Abend noch und ich hoffe hier bekommt nicht nochwer Albträume davon.


[add]
Ach ja, int war doch in C++ der Delphi-Integer und vorallem der, welcher auf 32 Bit eingefroren?
Gibt es in C++ denn nun einen 64 Bit-Boolean-Typ? Also das nächst Größere, wie LongBool.
In System.pas und in der Codevervollständigung konnte ich jedenfals nichts Entsprechendes.

Und gibt es vielleicht noch andere Typen, wo man aufpassen muß? ( ist int = INT ? )
$2B or not $2B

Geändert von himitsu (28. Okt 2012 um 01:15 Uhr)
  Mit Zitat antworten Zitat
Robotiker
(Gast)

n/a Beiträge
 
#2

AW: Typübersetzung C? <> Delphi

  Alt 28. Okt 2012, 10:15
Stimmt das denn nun so?
Äh, nein, das meiste ist entweder grob vereinfacht oder gar falsch.

Erstens mal, im ursprünglichen C, das ist immerhin schon 40 Jahre alt, gab es keinen Boolean Typ. Auch in den ersten C++ Versionen nicht. Daher dieses Chaos.

Mittlerweile gibt es in ISO-C und ISO-C++ solche Typen, das ist dann bool. Wie groß die sind, hängt wahrscheinlich vom Compiler und der Prozessorarchitektur ab. Ich gehe mal davon aus, dass der Standard irgendwas zur Konvertierbarkeit von int und bool sagt, ich habe aber keinen hier.
Tabellen wie diese hier sagen meist nichts über die Größe von bool:
http://en.cppreference.com/w/cpp/language/types
[Edit] In VC++ und dem C++ Builder gilt wohl sizeof(bool) == sizeof(char)[/Edit]

Zweitens, per Konvention, sind GROSS geschriebenen Sachen entweder Makros (#define) oder typedefs.

Die WinApi stammt auch noch aus der Zeit, als es in C keinen bool gab. Dort findet sich (Quelle WinDef.h aus Visual Studio 2008):
Code:
#ifndef BASETYPES
#define BASETYPES
typedef unsigned long ULONG;
typedef ULONG *PULONG;
typedef unsigned short USHORT;
typedef USHORT *PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR *PUCHAR;
typedef char *PSZ;
#endif /* !BASETYPES */

#define MAX_PATH         260

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

#ifndef FALSE
#define FALSE              0
#endif

#ifndef TRUE
#define TRUE               1
#endif

// gekürzt ...

#undef FAR
#undef NEAR
#define FAR                far
#define NEAR               near
#ifndef CONST
#define CONST              const
#endif

typedef unsigned long      DWORD;
typedef int                BOOL;
typedef unsigned char      BYTE;
typedef unsigned short     WORD;
typedef float              FLOAT;
typedef FLOAT              *PFLOAT;
typedef BOOL near          *PBOOL;
typedef BOOL far           *LPBOOL;
typedef BYTE near          *PBYTE;
typedef BYTE far           *LPBYTE;
typedef int near           *PINT;
typedef int far            *LPINT;
typedef WORD near          *PWORD;
typedef WORD far           *LPWORD;
typedef long far           *LPLONG;
typedef DWORD near         *PDWORD;
typedef DWORD far          *LPDWORD;
typedef void far           *LPVOID;
typedef CONST void far     *LPCVOID;

typedef int                INT;
typedef unsigned int       UINT;
typedef unsigned int       *PUINT;
Solche Dinge sind also immer Bibliotheksspezifisch. Zumindest was die WinAPI angeht, kann man aber von festen größen ausgehen.

Aber nicht davon, dass ein int immer 32 Bit groß ist, das ist bei Visual C++ und dem C++ Builder der Fall, beim Intel C++ aber z.B. nicht immer.

[Edit]
Übrigens gilt für COM anscheinend
Code:
typedef short VARIANT_BOOL;
Das sind also 16-Bit, und VARIANT_TRUE ist -1 !
[/Edit]

Zu C#, dort ist ein bool definitiv kein int, sondern ein Alias für
Code:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Boolean : IComparable, IConvertible, IComparable<bool>,
   IEquatable<bool>

Geändert von Robotiker (28. Okt 2012 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Typübersetzung C? <> Delphi

  Alt 10. Nov 2012, 20:49
C macht Einem das Leben nicht wirklich einfach.

Das mit den Booleans ist schon krankhaft, aber wer kommt auf die Idee mit dem "register"?


Code:
typedef void (*sort_func_t)(void *, size_t, register size_t, compare_func_t TSRMLS_DC);
Register heißt ja nun, daß dieser eine Parameter, welche mitten drin liegt, in die Register soll, obwohl alle anderen Parameter auf dem Stack liegen.
Delphi-Quellcode:
type
  sort_func_t = procedure(pDest: Pointer; dIndex: NativeUInt; register bucket_size: NativeUInt; proc: compare_func_t {$I TSRMLS_DC}); cdecl;
Das davor geht ja leider nicht, da es in cdel keine Register gibt und mit Registern von Links nach rechts sieht es irgendwie doof aus und der Code wird inkompatibel.
Delphi-Quellcode:
type
  sort_func_t = procedure(bucket_size: NativeUInt; dummy, dummy2: Integer {$I TSRMLS_DC}; proc: compare_func_t; dIndex: NativeUInt; pDest: Pointer);
$2B or not $2B
  Mit Zitat antworten Zitat
Robotiker
(Gast)

n/a Beiträge
 
#4

AW: Typübersetzung C? <> Delphi

  Alt 11. Nov 2012, 09:38
Register heißt ja nun, daß dieser eine Parameter, welche mitten drin liegt, in die
Nein.

register ist wie inline nur ein Vorschlag für den Compiler. Es stammt noch aus frühen C Zeiten und wird zuminest in der heutigen C++ Programmierung auf dem PC praktisch nicht verwendet.

Für einen Delphi Programmierer unter Windos spielt es eigentlich gar keine Rolle, da der MS Compiler register sowieso ignoriert.
Zitat:
The compiler does not accept user requests for register variables; instead, it makes its own register choices when global register-allocation optimization (/Oe option) is on.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02: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