Assigned - mit einem Testprogramm getestet

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Assigned - mit einem Testprogramm getestet

Beitrag von alexander »

Hi,

also ich habe mal nur um sicherzugehen das Testprogramm von assigned durchgespielt.

Code: Alles auswählen

procedure Example96;
{ Program to demonstrate the Assigned function. }
Var P : Pointer;
begin
  WriteLn('begin');
  If Not Assigned(P) then
    Writeln ('Pointer is initially NIL')
  else
    WriteLn('wtf???');
  If (P=nil) then
    Writeln ('Pointer is initially NIL')
  else
    WriteLn('wtf???');
 
  P:=@P;
 
  If Not Assigned(P) then
    Writeln('Internal inconsistency')
  else
    Writeln('All is well in FPC') ;
  If (P=nil) then
    Writeln('Internal inconsistency')
  else
    Writeln('All is well in FPC')  ;
end;
Doch de Ausgabe ist:

Code: Alles auswählen

begin
wtf???
wtf???
All is well in FPC
All is well in FPC
Wieso ist P nicht anfangs nil? Wieso geht er in das else Statement rein?

Gruß
alexander


PS: Wenigstens ist =Nil und assigned konsistent.
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Assigned - mit einem Testprogramm getestet

Beitrag von MAC »

P ist anfangs nicht nil. Denn beim bei deinem Programm fordert Dein Programm Arbeitsspeicher beim Betriebssystem an um die Variable P darin zu speichern. Und dieser Arbeitsspeicher muss nicht leer sein. Es kann sein das dort mal Informationen drinn standen, welche jetzt nicht mehr gebraucht werden. Und den Arbeitsspeicher anfangs zu löschen wäre zu Aufwändig und Ressourcenverschwendung. Deswegen sollten alle Variablen initialisiert werden. Sowohl Pointer, als auch z.B. booleanwerte bei Funktionen...

Code: Alles auswählen

Signatur := nil;

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Assigned - mit einem Testprogramm getestet

Beitrag von alexander »

Interessant. Danke!
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Assigned - mit einem Testprogramm getestet

Beitrag von mschnell »

alexander hat geschrieben:Wieso ist P nicht anfangs nil?
Nur globale/statische Variablen (an fester Position im statischen Memory) und Klassen-Variablen (automatisch verwaltet auf dem Heap) werden vor der ersten Benutzung genullt, lokale (Stack-) Variablen haben einen zufälligen Inhalt. Es wäre ein unverhältnismäßiger Aufwand sie immer zu nullen, weil sie ja mit jedem Unterprogramm-Aufruf neu angelegt werden.

Der "Typ" der Variable ist dabei egal. Ausnahme: ("long") Strings mit reference-counting, die werden auch auf "Leerstring" initatialisiert (das ist aber nicht gleich NIL), wenn es eine lokale Stack-Variable ist.

-Michael

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Assigned - mit einem Testprogramm getestet

Beitrag von alexander »

Danke fuer die ausführliche Erklärung!
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Antworten