Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IOHandler.ReadBytes: TIdBytes inkompatibler Typ ??? (https://www.delphipraxis.net/186412-iohandler-readbytes-tidbytes-inkompatibler-typ.html)

OlafSt 1. Sep 2015 14:21

IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Hallo Freunde,

so langsam ist es wohl an der Zeit, meinen Job an den Nagel zu hängen und Gärtner zu werden.

Folgende, extrem simple Routine:
Delphi-Quellcode:
//Compiler ist Delphi XE4 Professional
uses
     IdBaseComponent, IdComponent, IdSocketHandle,
     IdGlobal, IdContext, IdCustomTCPServer, IdTCPServer,
     IdIOHandler;

[...]

procedure TCUD_Main.MyTCPServerExecute(AContext: TIdContext);
var
   W: Word;
   b: byte;
   Block: IdGlobal.TIdBytes;
begin
     //
     w:=AContext.Connection.IOHandler.ReadWord;
     if (w <> $4711) then
     begin
          exit;
     end;
     b:=AContext.Connection.IOHandler.ReadByte;
     Setlength(Block, b);
     Block:=AContext.Connection.IOHandler.ReadBytes(Block, b, false);
end;
Daran ist ja nun nix schlimmes. Mein XE4 mein nun in der Zeile "Block:=AContext.Conn...":

Fehler E2010 Inkompatible Typen: 'TIdBytes' und 'procedure, untyped pointer or untyped parameter' :evil:

Ctrl-Click auf ReadBytes ergibt:
Delphi-Quellcode:
procedure TIdIOHandler.ReadBytes(var VBuffer: TIdBytes; AByteCount: Integer; AAppend: Boolean = True);
Was ist denn nu schon wieder kaputt ? :cry:

baumina 1. Sep 2015 14:24

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Warum machst dus nicht einfach so wies dort steht? Einfach das Block:= weglassen.

Delphi-Quellcode:
AContext.Connection.IOHandler.ReadBytes(Block, b, false);

OlafSt 2. Sep 2015 09:32

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Okay... Das ist der Beweis, das ich echt urlaubsreif bin. Jetzt kann ich Prozeduren nicht mehr von Funktionen unterscheidem :oops:

himitsu 2. Sep 2015 14:37

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
TIdBytes und TBytes sind nicht das "Selber", auch wenn sie das "Gleiche" sein mögen.

Leider ist man bei (vorallem Emba) nicht auf die geniale Idee gekommen und hat es (nicht) als TArray<Byte> deklariert. :wall:

OlafSt 3. Sep 2015 11:51

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Nunja... Wenn man sieht, wie Emba Generics compilertechnisch implementiert hat, kann ich das verstehen. Teile der VCL und natürlich Indy selbst wären in der Größe explodiert und die Größen der EXE-Dateien - ohnehin schon reichlich fett - wären noch heftiger geworden.

Ich frage mich, wie Microsoft in C# / VB.NET die Sache mit den Generics gelöst hat. Code wird jedenfalls nicht dupliziert.

Der schöne Günther 3. Sep 2015 11:54

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Ich kenne mich technisch so weit unten nicht aus, aber ich glaube Delphi ist technisch wesentlich näher an dem dran was man in C++ als Templates kennt. Da wird der Code auch dupliziert, aber in den Toolsets sind die Linker so schlau das wieder zu 99% herauszukürzen. Delphi ist da wohl noch nicht so weit.

Wie Generics in JIT-Sprachen wie Java oder .NET implementiert sind habe ich ehrlich gesagt keine Ahnung.

Sir Rufo 3. Sep 2015 12:02

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Zitat:

Zitat von OlafSt (Beitrag 1314549)
Ich frage mich, wie Microsoft in C# / VB.NET die Sache mit den Generics gelöst hat. Code wird jedenfalls nicht dupliziert.

Woher willst du das wissen? Was schaust du dir an, um das zu beurteilen? Die erzeugte EXE?

Wie das dort umgesetzt ist, kann ich auch nicht sagen, aber ich weiß, dass dieser erzeugte Code vor der Ausführung nochmals compiliert wird (JIT wie Günther schon geschrieben hat). Dieses müsste man sich konkret anschauen um eine zuverlässige Aussage treffen zu können. ;)

frankyboy1974 3. Sep 2015 12:24

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Hallo,

in Java wird der Code zuerst in einen Bytecode übersetzt, und erst zur Laufzeit dann in Maschinensprache schlussübersetzt (ob nun JIT oder nicht), ich habe zwar noch nie eine Java-VM programmiert, kann mir aber kaum vorstellen, dass es schneller geht, erst zu überprüfen ob bereits eine ähnliche Prommierlogik bereits übersetzt wurden ist oder es direkt in Maschinensprache zu übersetzen. Also ich würde davon ausgehen, dass eine Java-VM, durchaus Code dupliziert wieder gibt.

mfg

mkinzler 3. Sep 2015 12:27

AW: IOHandler.ReadBytes: TIdBytes inkompatibler Typ ???
 
Java/.Net verwendet Hotspot/JIT. So können grundsätzlich Entscheidungen in Folge von vorigen Läufen getroffen werden.
Zunehmend findet auch AOT-Kompilierung statt (z.B. ART).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 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