Typ lässt sich nicht redefinieren. Fehler: Doppelter Bezeich

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Typ lässt sich nicht redefinieren. Fehler: Doppelter Bezeich

Beitrag von thosch »

Hallo,

was ist da los. Bisher wird ein schon existenter Typ, den ich nochmals definiere, einfach redefiniert. Ich bekomme aber den Fehler doppelter Bezeichner. Kann ich da was machen?

Ich will im Zweifelsfall die fraglichen Typen redefinieren.

Wie muss ich vorgehen?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von compmgmt »

Hast vielleicht etwas Code? Dann kann man einfacher helfen.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von thosch »

[code]
type
WINBOOL = longbool;

[/quote]


Fehlermeldung:

Error: duplicate identifier "WINBOOL"
Hint : identifier alredy defined in <filename> at line xx

xx ist genau diejenige Zeile, in der ich "WINBOOL" definiert habe.

Wenn ich die WINBOOL Typdefinition auskommentiere, erhalte ich die Fehlermeldung:

Error: identifier not found: "WINBOOL"

Sind etwa betriebssystemabhängige Datentypen vom Compiler vordefiniert, wie die Integer Typen?

Ich programmiere unter Knoppix 7.6.

Ziel Betriebssystem ist Voreinstellung. Da ich Lazarus für Linux nutze, gehe ich davon aus, dass dann auch die Zielplattform Linux eingestellt ist.

Unter Zielplattform Windows akzeptiert der Compiler diesen Datentyp.



Ich kann mir beim besten Willen nicht vorstellen, dass das an meinem sonstigen Code liegt.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von compmgmt »

Was passiert wenn du "WINBOOL" am Definitionspunkt und an sämtlichen Nutzungspunkten umbenennst?

edit: Außerdem frage ich mich, wozu du das überhaupt brauchst, weil WINBOOL = LongBool = LongInt, der nur 0 und 1 benutzt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von thosch »

compmgmt hat geschrieben:Was passiert wenn du "WINBOOL" am Definitionspunkt und an sämtlichen Nutzungspunkten umbenennst?

edit: Außerdem frage ich mich, wozu du das überhaupt brauchst, weil WINBOOL = LongBool = LongInt, der nur 0 und 1 benutzt.

Habe den WINBOOL Bezeichner jetzt in WBOOL umbenannt. "Suchen->Ersetzen->Alle Ersetzen".

Läuft erst mal durch, macht aber in allen Dateien, in denen der WINBOOL Bezeichner auftaucht, die Umbenennung nötig.

WINBOOL ist aber auch in der Include-Datei Base.inc definiert. Ich habe diese Datei in gdi_base.inc umbenannt und verwende diese.

Bitte nicht fragen, warum ich das mache, ich will die Originaldateien hier nicht antasten und frage nur, warum es dieses Problem gibt.

Warum erkennt der Compiler WINBOOL nicht an, obwohl er den unter Windows einwandfrei anerkennt und ich Programme für Windows ohne dieses Probem übersetzen kann. Warum macht der Compiler bei Übersetzung für andere Plattformen, in meinem Fall Linux, hier Stress? Ein Compiler sollte da egal unter welcher Plattform er arbeitet, keine Unterschiede machen, der soll nicht wissen, wozu ich das brauche.


Ich brauche das, weil unter Windows dieser Bezeichner "WINBOOL" in der Datei "base.inc" so defininiert ist und ich die Windows Teile einfach unverändert übernehmen will. Zumindest will ich an den Typdefinitionen nichts ändern.

.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von compmgmt »

thosch hat geschrieben:Ich brauche das, weil unter Windows dieser Bezeichner "WINBOOL" in der Datei "base.inc" so defininiert ist und ich die Windows Teile einfach unverändert übernehmen will. Zumindest will ich an den Typdefinitionen nichts ändern.
Dann kannst du auch einfach LongBool benutzen. Weil WINBOOL = LongBool. Kleines Beispiel:

Code: Alles auswählen

type
  TA = LongBool;
  TB = LongBool;
 
procedure Test(a: TA); // Prozedur erwartet Typ TA
begin
  if a then ... // a = true
    else ... // a = false
end;
 
procedure Beispiel;
begin
  Test(TB(true)); // ich übergebe Typ TB
end;
Wenn ich jetzt Beispiel() aufrufe, funktioniert es trotzdem einwandfrei, da TA und TB beide LongBool sind. Du kannst sie also auch "vermischen".

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von wp_xyz »

Also das folgende Programm läuft auch unter Linux problemlos:

Code: Alles auswählen

program Project1;
 
{$mode objfpc}{$H+}
 
type
  WINBOOL = longbool;
 
begin
  WriteLn(boolean(1=1));
  WriteLn(boolean(1=0));
 
  WriteLn(WINBOOL(1=1));
  WriteLn(WINBOOL(1=0));
end.

Um zu sagen, warum dein Programm den Fehler zeigt, musst du schon mehr zeigen als nur die Deklaration von WINBOOL.

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von thosch »

Aus base.inc alias gdi_base.inc

Code: Alles auswählen

 
 
{$ifdef read_interface}
 
{$PACKRECORDS C}
 
  type
     ATOM = word;       //das hatte ich zunächst auskommentiert, sonst kommt die Fehlermeldung schon hier:
     TAtom = ATOM;    //Error: duplicate identifier "ATOM"
 
 
     CALTYPE = cardinal;
     CALID = cardinal;
 
     WINBOOL = longbool;  //Wenn ich von "ATOM" bis "CALID" auskommentiere, erhalte ich hier die Fehlermeldung:
     BOOL = WINBOOL;     //Error: duplicate identifier "WINBOOL"
 
     CCHAR = char;
 
 



Code: Alles auswählen

 
program wapi;
 
uses qtwinapi;
 
begin
  writeln('Ãœbersetzung erfolgreich!');
  writeln('Zurück mit < E N T E R > ... ');
  readln;
end.         \0
 


qtwinapi:

Code: Alles auswählen

 
unit qtwinapi;
 
interface
 
{$ifdef microwindows}
  {$LINK images}           // hier uninteressant, da "microwindows" NICHT definiert ist.
  {$LINK mwin}
  {$LINK nano-X}
{$endif}
 
{$ifdef read_implementation}
{$undef read_implementation}
{$endif}
{$define read_interface}
{$i gdi_base.inc}
{$i gdi_defines.inc}
$i gdi_base.inc}        // H I E R liegt mein FEHLER. Inzwischen bereinigt, Zeile gelöscht
{$i gdi_Struct.inc}
 
CONST
  AD_COUNTERCLOCKWISE     = 1;
  AD_CLOCKWISE            = 2;
  DIFFERENCE              = 11;
  AdjustedDirection : int = AD_COUNTERCLOCKWISE;
  ROP4                    = $0000AACC;
  DSTERASE                = $00220326;
  DSTCOPY                 = $00AA0029;
{
type
  TOSVERSIONINFO = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of Char;
  end;
  OSVERSIONINFO = TOSVERSIONINFO;
}
 
{$i qtwapih.inc} {(qt)(w)in (api) (h)eader}
 
implementation
 
uses
  mwindefs, wmacros, winfont, wingdi, gfx_wnd;
{$undef read_interface}
{$define read_implementation}
{$i gdi_defines.inc}
{$i gdi_base.inc}
{$i gdi_struct.inc}
 
{$i qtwapii.inc}  {(qt)(w)in (api)(i)mplementation}
 
end.           \0
 


Das Präfix "gdi_" habe ich davor gesetzt und die Includedateien in einen separaten Ordner kopiert. Im Grunde handelt es sich um jene .inc Dateien, in denen sich die Windows Definitionen befinden. defines.inc, base.inc, struct.inc.

Weil ich die Originaldateien nicht antasten will, habe ich mir die in einen eigenen Ordner kopiert und mit dem Präfix "gdi_" versehen.


Diesen Fehler habe ich somit, siehe Kommentar, inzwischen selber gefunden. Nun aber spinnt er bei den Konstanten rum.

In defines.inc -> alias gdi_defines.inc folgende Meldungen:

Hier ein Codeauszug: (entspricht der Datei "defines.inc")

Code: Alles auswählen

 
 
{$ifdef read_interface}
 
{$PACKRECORDS C}
 
  const
     //UNICODE_NULL = WCHAR(#0);
     MAX_PATH = 260;
     LF_FACESIZE = 32;
     LF_FULLFACESIZE = 64;
     ELF_VENDOR_SIZE = 4;
     SECURITY_STATIC_TRACKING = 0;
     SECURITY_DYNAMIC_TRACKING = 1;
     MAX_DEFAULTCHAR = 2;
     MAX_LEADBYTES = 12;
     EXCEPTION_MAXIMUM_PARAMETERS = 15;
     CCHDEVICENAME = 32;
     CCHFORMNAME = 32;
     MENU_TEXT_LEN = 40;
     MAX_LANA = 254;
     NCBNAMSZ = 16;
     NETBIOS_NAME_LEN = 16;
     OFS_MAXPATHNAME = 128;
     MAX_TAB_STOPS = 32;
     ANYSIZE_ARRAY = 1;
     RAS_MaxCallbackNumber = 128;
     RAS_MaxDeviceName = 128;
     RAS_MaxDeviceType = 16;
     RAS_MaxEntryName = 256;
     RAS_MaxIpAddress = 15;
     RAS_MaxIpxAddress = 21;
     RAS_MaxPhoneNumber = 128;
     UNLEN = 256;
     PWLEN = 256;
     CNLEN = 15;
     DNLEN = 15;
  { Unsigned types max  }
\0


Projekt kompilieren, Ziel: wapi: Exit code 256, Fehler: 50, Hinweise: 51
gdi_defines.inc(1205,39) Hint: Conversion between ordinals and pointers is not portable
gdi_defines.inc(1206,37) Hint: Conversion between ordinals and pointers is not portable
gdi_defines.inc(51,20) Error: Duplicate identifier "MAX_PATH"
gdi_defines.inc(51,20) Hint: Identifier already defined in gdi_defines.inc at line 51
gdi_defines.inc(52,22) Error: Duplicate identifier "LF_FACESIZE"
gdi_defines.inc(52,22) Hint: Identifier already defined in gdi_defines.inc at line 52
gdi_defines.inc(53,26) Error: Duplicate identifier "LF_FULLFACESIZE"
gdi_defines.inc(53,26) Hint: Identifier already defined in gdi_defines.inc at line 53
gdi_defines.inc(54,25) Error: Duplicate identifier "ELF_VENDOR_SIZE"
gdi_defines.inc(54,25) Hint: Identifier already defined in gdi_defines.inc at line 54
gdi_defines.inc(55,34) Error: Duplicate identifier "SECURITY_STATIC_TRACKING"
gdi_defines.inc(55,34) Hint: Identifier already defined in gdi_defines.inc at line 55
gdi_defines.inc(56,35) Error: Duplicate identifier "SECURITY_DYNAMIC_TRACKING"
gdi_defines.inc(56,35) Hint: Identifier already defined in gdi_defines.inc at line 56
gdi_defines.inc(57,25) Error: Duplicate identifier "MAX_DEFAULTCHAR"
gdi_defines.inc(57,25) Hint: Identifier already defined in gdi_defines.inc at line 57
gdi_defines.inc(58,24) Error: Duplicate identifier "MAX_LEADBYTES"
gdi_defines.inc(58,24) Hint: Identifier already defined in gdi_defines.inc at line 58
gdi_defines.inc(59,39) Error: Duplicate identifier "EXCEPTION_MAXIMUM_PARAMETERS"
gdi_defines.inc(59,39) Hint: Identifier already defined in gdi_defines.inc at line 59
gdi_defines.inc(60,24) Error: Duplicate identifier "CCHDEVICENAME"
gdi_defines.inc(60,24) Hint: Identifier already defined in gdi_defines.inc at line 60
gdi_defines.inc(61,22) Error: Duplicate identifier "CCHFORMNAME"
gdi_defines.inc(61,22) Hint: Identifier already defined in gdi_defines.inc at line 61
gdi_defines.inc(62,24) Error: Duplicate identifier "MENU_TEXT_LEN"
gdi_defines.inc(62,24) Hint: Identifier already defined in gdi_defines.inc at line 62
gdi_defines.inc(63,20) Error: Duplicate identifier "MAX_LANA"
gdi_defines.inc(63,20) Hint: Identifier already defined in gdi_defines.inc at line 63
gdi_defines.inc(64,19) Error: Duplicate identifier "NCBNAMSZ"
gdi_defines.inc(64,19) Hint: Identifier already defined in gdi_defines.inc at line 64
gdi_defines.inc(65,27) Error: Duplicate identifier "NETBIOS_NAME_LEN"
gdi_defines.inc(65,27) Hint: Identifier already defined in gdi_defines.inc at line 65
gdi_defines.inc(66,27) Error: Duplicate identifier "OFS_MAXPATHNAME"
gdi_defines.inc(66,27) Hint: Identifier already defined in gdi_defines.inc at line 66
gdi_defines.inc(67,24) Error: Duplicate identifier "MAX_TAB_STOPS"
gdi_defines.inc(67,24) Hint: Identifier already defined in gdi_defines.inc at line 67
gdi_defines.inc(68,23) Error: Duplicate identifier "ANYSIZE_ARRAY"
gdi_defines.inc(68,23) Hint: Identifier already defined in gdi_defines.inc at line 68
gdi_defines.inc(69,33) Error: Duplicate identifier "RAS_MaxCallbackNumber"
gdi_defines.inc(69,33) Hint: Identifier already defined in gdi_defines.inc at line 69
gdi_defines.inc(70,29) Error: Duplicate identifier "RAS_MaxDeviceName"
gdi_defines.inc(70,29) Hint: Identifier already defined in gdi_defines.inc at line 70
gdi_defines.inc(71,28) Error: Duplicate identifier "RAS_MaxDeviceType"
gdi_defines.inc(71,28) Hint: Identifier already defined in gdi_defines.inc at line 71
gdi_defines.inc(72,28) Error: Duplicate identifier "RAS_MaxEntryName"
gdi_defines.inc(72,28) Hint: Identifier already defined in gdi_defines.inc at line 72
gdi_defines.inc(73,27) Error: Duplicate identifier "RAS_MaxIpAddress"
gdi_defines.inc(73,27) Hint: Identifier already defined in gdi_defines.inc at line 73
gdi_defines.inc(74,28) Error: Duplicate identifier "RAS_MaxIpxAddress"
gdi_defines.inc(74,28) Hint: Identifier already defined in gdi_defines.inc at line 74
gdi_defines.inc(75,30) Error: Duplicate identifier "RAS_MaxPhoneNumber"
gdi_defines.inc(75,30) Hint: Identifier already defined in gdi_defines.inc at line 75
gdi_defines.inc(76,17) Error: Duplicate identifier "UNLEN"
gdi_defines.inc(76,17) Hint: Identifier already defined in gdi_defines.inc at line 76
gdi_defines.inc(77,17) Error: Duplicate identifier "PWLEN"
gdi_defines.inc(77,17) Hint: Identifier already defined in gdi_defines.inc at line 77
gdi_defines.inc(78,16) Error: Duplicate identifier "CNLEN"
gdi_defines.inc(78,16) Hint: Identifier already defined in gdi_defines.inc at line 78
gdi_defines.inc(79,16) Error: Duplicate identifier "DNLEN"
gdi_defines.inc(79,16) Hint: Identifier already defined in gdi_defines.inc at line 79
gdi_defines.inc(81,26) Error: Duplicate identifier "MAXDWORD"
gdi_defines.inc(81,26) Hint: Identifier already defined in gdi_defines.inc at line 81
gdi_defines.inc(82,21) Error: Duplicate identifier "MAXWORD"
gdi_defines.inc(82,21) Hint: Identifier already defined in gdi_defines.inc at line 82
gdi_defines.inc(83,19) Error: Duplicate identifier "MAXBYTE"
gdi_defines.inc(83,19) Hint: Identifier already defined in gdi_defines.inc at line 83
gdi_defines.inc(85,19) Error: Duplicate identifier "MINCHAR"
gdi_defines.inc(85,19) Hint: Identifier already defined in gdi_defines.inc at line 85
gdi_defines.inc(86,19) Error: Duplicate identifier "MAXCHAR"
gdi_defines.inc(86,19) Hint: Identifier already defined in gdi_defines.inc at line 86
gdi_defines.inc(87,22) Error: Duplicate identifier "MINSHORT"
gdi_defines.inc(87,22) Hint: Identifier already defined in gdi_defines.inc at line 87
gdi_defines.inc(88,22) Error: Duplicate identifier "MAXSHORT"
gdi_defines.inc(88,22) Hint: Identifier already defined in gdi_defines.inc at line 88
gdi_defines.inc(89,25) Error: Duplicate identifier "MINLONG"
gdi_defines.inc(89,25) Hint: Identifier already defined in gdi_defines.inc at line 89
gdi_defines.inc(90,25) Error: Duplicate identifier "MAXLONG"
gdi_defines.inc(90,25) Hint: Identifier already defined in gdi_defines.inc at line 90
gdi_defines.inc(92,20) Error: Duplicate identifier "FILE_BEGIN"
gdi_defines.inc(92,20) Hint: Identifier already defined in gdi_defines.inc at line 92
gdi_defines.inc(93,22) Error: Duplicate identifier "FILE_CURRENT"
gdi_defines.inc(93,22) Hint: Identifier already defined in gdi_defines.inc at line 93
gdi_defines.inc(94,18) Error: Duplicate identifier "FILE_END"
gdi_defines.inc(94,18) Hint: Identifier already defined in gdi_defines.inc at line 94
gdi_defines.inc(96,17) Error: Duplicate identifier "OF_READ"
gdi_defines.inc(96,17) Hint: Identifier already defined in gdi_defines.inc at line 96
gdi_defines.inc(97,22) Error: Duplicate identifier "OF_READWRITE"
gdi_defines.inc(97,22) Hint: Identifier already defined in gdi_defines.inc at line 97
gdi_defines.inc(98,18) Error: Duplicate identifier "OF_WRITE"
gdi_defines.inc(98,18) Hint: Identifier already defined in gdi_defines.inc at line 98
gdi_defines.inc(99,25) Error: Duplicate identifier "OF_SHARE_COMPAT"
gdi_defines.inc(99,25) Hint: Identifier already defined in gdi_defines.inc at line 99
gdi_defines.inc(100,29) Error: Duplicate identifier "OF_SHARE_DENY_NONE"
gdi_defines.inc(100,29) Hint: Identifier already defined in gdi_defines.inc at line 100
gdi_defines.inc(101,29) Error: Duplicate identifier "OF_SHARE_DENY_READ"
gdi_defines.inc(101,29) Hint: Identifier already defined in gdi_defines.inc at line 101
gdi_defines.inc(102,30) Error: Duplicate identifier "OF_SHARE_DENY_WRITE"
gdi_defines.inc(102,30) Hint: Identifier already defined in gdi_defines.inc at line 102
gdi_defines.inc(103,29) Error: Duplicate identifier "OF_SHARE_EXCLUSIVE"
gdi_defines.inc(103,29) Hint: Identifier already defined in gdi_defines.inc at line 103
gdi_defines.inc(104,22) Error: Duplicate identifier "OF_CANCEL"

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von Mathias »

Warum erkennt der Compiler WINBOOL nicht an, obwohl er den unter Windows einwandfrei anerkennt und ich Programme für Windows ohne dieses Probem übersetzen kann. Warum macht der Compiler bei Übersetzung für andere Plattformen, in meinem Fall Linux, hier Stress? Ein Compiler sollte da egal unter welcher Plattform er arbeitet, keine Unterschiede machen, der soll nicht wissen, wozu ich das brauche.

Hast du irgendwo die Unit Windows eingebunden ?
Aber wahrscheinlich nicht, das du auch für Linux kompiliert hast.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von wp_xyz »

Ich denke eher an LCLIntf, da ist das ganze qtwinapi nochmals deklariert. Ich würde versuchen, die eigene qtwinapi wegzulassen und stattdessen LclIntf zu verwenden.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von Warf »

compmgmt hat geschrieben:Außerdem frage ich mich, wozu du das überhaupt brauchst, weil WINBOOL = LongBool = LongInt, der nur 0 und 1 benutzt.


Es gibt sehr viele Gründe Longbool zu verwenden, der Offensichtlichste ist natürlich für C Kompatiblität, da die meisten C Bibliotheken einfach Int als Boolean verwenden, aber ich benutze LongBools sehr gerne um zu überprüfen ob ein Wert <> 0 ist, z.B. bei Bitflags

Code: Alles auswählen

function isBitSet(v: Integer; bit: Integer): Longbool;
begin
  Result := LongBool(v and (1 shl bit));
end;


Denn neben dem Wahrheitswert den man damit überprüfen kann, verliert man gleichzeitig nicht die Information über welches Bit gesetzt wurde

Code: Alles auswählen

  bitNSet := isBitSet(v, 3);
  v := v and not Integer(bitNSet); // delete bitflag
 
if bitNSet then
  // dosomething
else
  // dosomething else
 
v := v or Integer(bitNSet); // reset bit


Außerdem kann das auf einigen Architekturen (ich glaube auf ARM prozessoren) in weniger Arbeitsschritten ausgeführt werden im gegensatz zu einem Vergleich wie:

Code: Alles auswählen

function isBitSet(v: Integer; bit: Integer): Boolean;
begin
  Result := (v and (1 shl bit)) = (1 shl bit) // oder > 0 oder <> 0, je nach belieben
end;

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von compmgmt »

Warf hat geschrieben:
compmgmt hat geschrieben:Außerdem frage ich mich, wozu du das überhaupt brauchst, weil WINBOOL = LongBool = LongInt, der nur 0 und 1 benutzt.


Es gibt sehr viele Gründe Longbool zu verwenden, der Offensichtlichste ist natürlich für C Kompatiblität, da die meisten C Bibliotheken einfach Int als Boolean verwenden, aber ich benutze LongBools sehr gerne um zu überprüfen ob ein Wert <> 0 ist, z.B. bei Bitflags
Ich meinte auch nicht, warum er LongBool benutzt, sondern warum er WINBOOL benutzt. Denn WINBOOL ist ja gleich LongBool. Also kann er auch, statt WINBOOL als LongBool zu deklarieren, direkt LongBool verwenden ;)

Wow, drei mal LongBool in einem Satz :lol:

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von thosch »

Danke für den Tipp. In der Lclintf.pas sind zwar die monierten Typen nicht direkt definiert, habe nachgeschaut, aber nun weiß ich in welche Richtung ich suchen muss, um den Compilerfehler einzugrenzen. Eine der Interface Units also, die wohl vom Compiler intern automatisch eingebunden werden, wegen des verwendeten Interfaces. Da müssen die fraglichen Typen unabhängig von den von mir verwendeten Include Dateien nochmals definiert sein. Vielleicht verwende ich ja auch wegen dieses Designs von Lazarus diese Definitionen doppelt. In lcltype.pas sind schon mal einige der monierten Typen schon definiert. Ich schaue weiter.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von Warf »

compmgmt hat geschrieben:
Warf hat geschrieben:Es gibt sehr viele Gründe Longbool zu verwenden, der Offensichtlichste ist natürlich für C Kompatiblität, da die meisten C Bibliotheken einfach Int als Boolean verwenden, aber ich benutze LongBools sehr gerne um zu überprüfen ob ein Wert <> 0 ist, z.B. bei Bitflags
Ich meinte auch nicht, warum er LongBool benutzt, sondern warum er WINBOOL benutzt. Denn WINBOOL ist ja gleich LongBool. Also kann er auch, statt WINBOOL als LongBool zu deklarieren, direkt LongBool verwenden ;)

Wow, drei mal LongBool in einem Satz :lol:


Das finde ich auch so toll in der Windows API, die haben irgendwie für jeden Typen gefühlte 50 verschiedene Bezeichner eingeführt, das das erste ist was ich mache wenn ich WinAPI Code habe, mit Strg+Click rausfinden was denn jetzt was ist :D

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Beitrag von compmgmt »

Warf hat geschrieben:
compmgmt hat geschrieben:
Warf hat geschrieben:Es gibt sehr viele Gründe Longbool zu verwenden, der Offensichtlichste ist natürlich für C Kompatiblität, da die meisten C Bibliotheken einfach Int als Boolean verwenden, aber ich benutze LongBools sehr gerne um zu überprüfen ob ein Wert <> 0 ist, z.B. bei Bitflags
Ich meinte auch nicht, warum er LongBool benutzt, sondern warum er WINBOOL benutzt. Denn WINBOOL ist ja gleich LongBool. Also kann er auch, statt WINBOOL als LongBool zu deklarieren, direkt LongBool verwenden ;)

Wow, drei mal LongBool in einem Satz :lol:


Das finde ich auch so toll in der Windows API, die haben irgendwie für jeden Typen gefühlte 50 verschiedene Bezeichner eingeführt, das das erste ist was ich mache wenn ich WinAPI Code habe, mit Strg+Click rausfinden was denn jetzt was ist :D
Das ist aber nicht nur in der Windows API so, auch Lazarus selbst macht das leider. Schau dir z.B. mal LongWord an. DWord = Cardinal = LongWord. Das ergibt genau so wenig Sinn.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten