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

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

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

Beitragvon thosch » 2. Aug 2017, 08:40 Typ lässt sich nicht redefinieren. Fehler: Doppelter Bezeich

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?
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon compmgmt » 2. Aug 2017, 08:47 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

Hast vielleicht etwas Code? Dann kann man einfacher helfen.
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon thosch » 2. Aug 2017, 09:11 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

[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.
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon compmgmt » 2. Aug 2017, 11:56 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon thosch » 2. Aug 2017, 12:13 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.

.
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon compmgmt » 2. Aug 2017, 12:29 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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".
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon wp_xyz » 2. Aug 2017, 12:30 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.
wp_xyz
 
Beiträge: 2184
Registriert: 8. Apr 2011, 08:01

Beitragvon thosch » 2. Aug 2017, 15:05 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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"
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon Mathias » 2. Aug 2017, 17:22 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3034
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 2. Aug 2017, 17:36 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.
wp_xyz
 
Beiträge: 2184
Registriert: 8. Apr 2011, 08:01

Beitragvon Warf » 2. Aug 2017, 18:00 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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;
Warf
 
Beiträge: 587
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon compmgmt » 2. Aug 2017, 18:41 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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:
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon thosch » 2. Aug 2017, 19:16 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon Warf » 2. Aug 2017, 19:17 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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
Warf
 
Beiträge: 587
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon compmgmt » 2. Aug 2017, 19:21 Re: Typ lässt sich nicht redefinieren. Fehler: Doppelter Bez

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.
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 Gäste

porpoises-institution
accuracy-worried