Autor Beitrag
allshoot
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22


d5 standart
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 22.02.06 14:30 
untypisiert:

var p : pointer; //unbekannter Typ

typisiert:

var p : TObject; //Pointer auf eine Instanz von TObject
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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:

ausblenden 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.
ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22


d5 standart
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 22.02.06 14:49 
Um flexibel zu sein.
Dies ist eine Art Äquivalent zu Variant.

_________________
Markus Kinzler.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 22.02.06 14:51 
user profile iconallshoot hat folgendes geschrieben:
Und welchen Zweck hat es, einen Zeiger zu benutzen, bei dem ich nicht weiß, was an seinem Ende steht?

allshoot


(Zum Beispiel) Wenn der Rückgabewert einer Funktion von bestimmten Parametern abhängt. Dann kannst du dir zB ein Feld im Rückgabewert machen, das dir sagt, was in der Funktion passiert ist und castest den Pointer entsprechend:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type
  TResult = record
    DataType: Integer;
    Data: Pointer;
    end;

const
  RETURN_HANDLE = 456;

function DoSomething(AParameter: Integer): TResult;
begin
  case AParameter of
    123begin
           Result.DataType := RETURN_HANDLE;
           Result.Data := Pointer(@...);
         end;
    ...
    end;
end;
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 22.02.06 14:57 
allshoot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22


d5 standart
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.