Autor |
Beitrag |
allshoot
      
Beiträge: 22
d5 standart
|
Verfasst: Mi 22.02.06 14:27
Hi, habe ein dickes Problem!
Ich muss mit Delphi programmieren lernen!
Spaß beiseite, mir hat heute einer probiert, zu Erklären, was ein untypisierter Zeiger ist und ich habe es nicht geschnallt.
Weiß einer ne Erklärung, die ein mitteleuropäisches Hausschwein verstehen könnte oder eine Seite, wo es so steht, ich habe es bis jetzt noch nicht gefunden?!
THX
allshoot
|
|
Spaceguide
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Mi 22.02.06 14:30
untypisiert:
var p : pointer; //unbekannter Typ
typisiert:
var p : TObject; //Pointer auf eine Instanz von TObject
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 22.02.06 14:40
Hallo!
Grundsätzlich ist ja ein Pointer ein Zeiger auf einen Speicherbereich. Von untypisierten Zeigern spricht man, wenn man nicht weiss, was für eine Art von Daten man an dieser Stelle im Speicher vorfindet.
Dagegen ein typisierter Zeiger:
Delphi-Quelltext 1: 2:
| type TPointerToInteger=^Integer; var P2Int:TPointerToInteger; |
Hier ist sofort klar, daß sich an der Speicherstelle ein Integerwert befindet bzw. befinden wird. Der Compiler lässt dann auch ohne explizite Typangabe eine Wertzuweisung zu.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| GetMem(P2Int,SizeOf(Integer)); try P2Int^:=4; ShowMessage(IntToStr(P2Int^)); finally FreeMem(P2Int); end; |
Bei einem untypisiertem Pointer müsste man den Typen dagegen explizit umwandeln:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| GetMem(GenericPtr,SizeOf(Integer)); try Integer(GenericPtr^):=4; ShowMessage(IntToStr(Integer(GenericPtr^))); finally FreeMem(GenericPtr); end; |
Cu,
Udontknow
Zuletzt bearbeitet von Udontknow am Mi 22.02.06 14:46, insgesamt 1-mal bearbeitet
|
|
allshoot 
      
Beiträge: 22
d5 standart
|
Verfasst: Mi 22.02.06 14:45
Und welchen Zweck hat es, einen Zeiger zu benutzen, bei dem ich nicht weiß, was an seinem Ende steht?
allshoot
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 22.02.06 14:49
Um flexibel zu sein.
Dies ist eine Art Äquivalent zu Variant.
_________________ Markus Kinzler.
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Mi 22.02.06 14:51
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 22.02.06 14:54
Vielleicht ein wenig unglücklich ausgedrückt: Der Entwickler weiss natürlich, was sich dahinter verbirgt, der Datentyp ist nur nicht direkt am Typ des Zeigers zu erkennen. Beispiele habe ich momentan aber keins parat, ich grüble noch ein wenig...
Cu,
Udontknow
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Mi 22.02.06 14:57
|
|
allshoot 
      
Beiträge: 22
d5 standart
|
Verfasst: Mi 22.02.06 15:41
Ok!
Danke Leute, der Nebel hat sich etwas gelüftet, wobei das Beispiel von AXMD mir noch etwas zu kompliziert ist.
Werde es wohl im Laufe des benutzens noch genauer verstehen!
THX
allshoot
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 22.02.06 15:46
Bestes Beispiel sind wieder mal (leider) die VCL-Sources ...
In den VCL-Sources werden große Teile der Windows-Datentypen nicht übersetzt, weil die Borland-Entwickler der Meinung waren, dass manche Typen eh nicht verwendet werden würden. Und anstatt nun alle Typen mal feinsäuberlich zu übersetzen schreibt man einfach nen Pointer hin, weil man sich zu schade ist, einige Typen zu übersetzen.
BTW: Einige Typen gehen auch nicht direkt zu übersetzen, das aber mal nebenbei.
Wenn man nun eine solche Funktion der WinAPI aufruft, stimmen zwar erstmal die Anzahl der Parameter, aber um die Korrektheit der Daten muss man sich selber kümmern. Soweit zu den Negativ-Beispielen.
Eine Positive Anwendung nutzt nämlich die WinAPI bei ihren Ex-Funktionen: Diese akzeptieren sowohl die Standard- als auch die Erweiterten Parameter-Strukturen als Parameter, die anhand der Vorinitialisierung unterschieden werden. Würde man hier typisierte Pointer als Argumente nutzen, müsste man jedes Mal beim Aufruf einer solchen Funktion seine Parameter casten.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|