Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ungültige Typumwandlung mit Pointer (https://www.delphipraxis.net/167610-ungueltige-typumwandlung-mit-pointer.html)

Tomski 9. Apr 2012 12:50

Ungültige Typumwandlung mit Pointer
 
Hallo Leute, bin neu hier und adaptiere gerade meine Delphi 2007 Programme auf Delphi XE. Klappt auch alles hervorragend bis auf eine Unit, die ich nicht selbst programmiert habe und die beim compilieren an folgender Typumwandlung scheitert. Unter Delphi 2007 gabs mit dieser Zuweisung keine Probleme...

function RunExternalFunc(aFuncName: String): Variant;
var TempPointer : Pointer;
ConvertArray2: Array[0..3] of Char;
begin
TempPointer := Pointer(ConvertArray2);
end;

Das ist natürlich nicht die ganze Funktion, sondern nur der Teil der folgende Compiler-Fehlermeldung generiert... E2089 Ungültige Typumwandlung. Finde leider die Lösung des Problems nicht und bin euch sehr verbunden wenn Ihr mir hierzu die Lösung nennen könnt.

Beste Grüße und einen schönen Ostermontag noch
Tomski

himitsu 9. Apr 2012 12:57

AW: Ungültige Typumwandlung mit Pointer
 
Delphi-Quellcode:
TempPointer := PPointer(@ConvertArray2)^;


Aber du solltest aufpassen, denn im 64-Bit-Compiler wird es da Probleme mit geben,


Delphi-Quellcode:
var
  ConvertArray2: Array[0..3] of AnsiChar;
  ConvertPointer2: Pointer absolute ConvertArray2; // damit erspart man sich die Zuweisung, da Beide den selben Inhalt haben
  {$IF SizeOf(ConvertPointer2) <> SizeOf(ConvertArray2)}
    {$MESSAGE Fatal 'Konvertierung nicht möglich'}
  {$IFEND}
begin

[edit]
Halt, falsch.

Das Problem ist, daß Char nun 2 Byte ist ... 8 Byte (4*Char) <> 4 Byte (32 Bit-Pointer)

jaenicke 9. Apr 2012 13:13

AW: Ungültige Typumwandlung mit Pointer
 
Wenn ich mir so den Funktionsnamen anschaue, dann wäre vielleicht die Unit System.Rtti und dort speziell TRttiMethodType usw. etwas für dich. Damit kann man Funktionen mit ihren Parametern aufrufen usw., was ich auch z.B. mit Systembibliotheken aus einer Skriptumgebung heraus mache.

Bjoerk 9. Apr 2012 16:13

AW: Ungültige Typumwandlung mit Pointer
 
Das ganze kann man ja auch mit typisierten Pointern machen und auch nicht nur casten.
Delphi-Quellcode:
function RunExternalFunc(aFuncName: string): Variant;
type
  TConvertArray2: array [0..3] of char;
  PConvertArray2: ^TConvertArray2:
var
  T: TConvertArray2;
  P: PConvertArray2;
begin
  New(P);
  ..
  P^:= T;
  ..
  Dispose(P);
end;

Tomski 9. Apr 2012 16:57

AW: Ungültige Typumwandlung mit Pointer
 
Hi Himitsu, Sebastian und Björg,

erstmal Danke für eure Anregungen, habe das Beispiel von himitsu aufgegriffen und das ConvertArray2 als Ansichar statt Char deklariert. Der Compiler meckert nicht mehr und die Ausführung des Programmes ist korrekt. Solche Deklarierungen hätte ich wohl auch selbst rausfinden können, dachte aber dass das Problem nicht so einfach ist.

Obwohl ich seit 1997 in Delphi programmiere bin ich noch nie in die Verlegenheit gekommen mit Pointern zu arbeiten und das kann ich allen nur empfehlen. Alleine dieses Projekt hat über 200K Quelltextzeilen, wobei der Teil der von mir ist etwa 180K hat. Die restlichen sind Units mit zahllosen Pointerdeklarationen und genau diese machen die meisten Probleme beim adaptieren auf die Delphi XE Version, wobei die Tücke zum Großteil darin liegt das der Compiler nicht meckert.

In diesem Sinne wünsche ich allen noch einen schönen Abend
Tomski

himitsu 9. Apr 2012 17:00

AW: Ungültige Typumwandlung mit Pointer
 
@Bjoerk:
Er will zwei Datentypen untereinander casten und nicht einen Typ mit seinem Pointer.

Es bringt absolut nichts, wenn er die Daten von einer Variable in eine andere dynamische Variable (New) kopiert ... das ändert doch nichts am Typ. :zwinker:


@Tomski:
Das gößte Problem sind untypisierte Casts.
Da kann Delphi garnichts machen, da es nicht erkennt was wirklich gemeint ist.
Dazu zählt übrigens auch
Delphi-Quellcode:
TempPointer := PPointer(@ConvertArray2)^;
, denn dort wird jegliche Typprüfung umgangen. :oops:

Ansonsten sollte man nicht nur auf Fehler (Error) und schwere Fehler (Fatal Error) hören, sondern auch auf die Hinweise (Hint), welche der Compiler ausspuckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz