AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ungültige Typumwandlung mit Pointer
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültige Typumwandlung mit Pointer

Ein Thema von Tomski · begonnen am 9. Apr 2012 · letzter Beitrag vom 9. Apr 2012
Antwort Antwort
Tomski

Registriert seit: 17. Jun 2010
19 Beiträge
 
Delphi 2 Desktop
 
#1

Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 13:50
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 13:57
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Apr 2012 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 14:13
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 17:13
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;
  Mit Zitat antworten Zitat
Tomski

Registriert seit: 17. Jun 2010
19 Beiträge
 
Delphi 2 Desktop
 
#5

AW: Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 17:57
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ungültige Typumwandlung mit Pointer

  Alt 9. Apr 2012, 18:00
@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.


@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 TempPointer := PPointer(@ConvertArray2)^; , denn dort wird jegliche Typprüfung umgangen.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Apr 2012 um 18:06 Uhr)
  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 12:05 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