Nullpointer ???

Onkel Dagobert

Level-3
Beiträge
5.792
Reaktionspunkte
1.429
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

hat jemand eine Ahnung was ein Nullpointer ist und wozu man den sinnvoll verwenden kann?

Was macht z.Bsp. folgender Funktionsaufruf?
Code:
TEMP_INT := FILL(BVAL :=  NIL,
                  BLK := TEMP_TAKTE);
SCL übernimmt das erst einmal. Wird der Bereich "TEMP_TAKTE" gelöscht?


Gruß, Onkel
 
Nil

Hallo,

Onkel Dago schrieb:
Was macht z.Bsp. folgender Funktionsaufruf?

Das kann man nicht beurteilen, ohne dass Du den Quelltext der Funktion hier einstellst.

Onkel Dago schrieb:
SCL übernimmt das erst einmal. Wird der Bereich "TEMP_TAKTE" gelöscht?

Auch das kann man nicht beurteilen, ohne die Funktion "FILL" zu kennen. Alles ist möglich ..
Ein NullPointer ist zuerst mal, ganz allgemein und nicht nur auf SCL bezogen, ein Pointer auf ein nicht instanziiertes oder bereits freigegebenes Objekt, ein programmtechnischer Zugriff auf dieses Objekt wird Dir mit Sicherheit ein GPF von Windows um die Ohren hauen, da ein Zeiger ins Nirwana ...
Noch schlimmer wird es, wenn nach der Freigabe Deines Objektes der Pointer nicht auf NIL zeigt, sondern auf ein bereits freigebenenes Objekt *ROFL*
Wenn Du uns die Procedure Fill nicht im Quelltext zeigst, kann keiner ohne die berühmte Kristallkugel beurteilen, wie sich die Procedure bei einer Übergabe eines Nullpointers verhalten wird.

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
NIL Pointer

Hallo,

genausogut kann die Procedure Fill den Pointer auf "BVAL" auf "NIL" abfragen und dann evtl. gar nichts machen, aber meine Kristallkugel muss mal wieder poliert werden ...

Gruß

Question_mark
 
Ist denn der FILL-Befehl mit der SFC21 vergleichbar ? Möglicherweise gewinnt man ja neue Erkenntnisse, wenn man den übersetzten Baustein in AWL betrachtet.

Grüße von HaDi
 
Alles NIL, oder was ???

Hallo,

HaDi schrieb:
Ist denn der FILL-Befehl mit der SFC21 vergleichbar

Ist mir eigentlich egal. Kenne den Befehl aus verschiedenen Hochsprachen, um bestimmte Speicherbereiche mit einem vordefiniertem Wert zu füllen..
Ich denke mal, so aus der Hüfte geschossen, der Speicherbereich ist "BLK", der einzuschreibende Wert ist eine Variable "BVAL", wenn diese auf NIL zeigt wird auch nichts in den Speicherbereich reingeschrieben... , aber wie gesagt, Kristallkugel ...

Gruß

Question_mark
 
Zuletzt bearbeitet:

Anhänge

  • SFC 21 FILL.pdf
    11,7 KB · Aufrufe: 29
Danke für die Antworten!

Ja, natürlich handelt es sich um die SFC21. Da habe ich ja wieder einmal Fachleute wie auch Hexenmeister vor Rätsel gestellt. Das war natürlich nicht meine Absicht ;) . Wo bekommt man eigentlich so eine Kristallkugel her?


Gruß, Onkel
 
*gg*

Hallo,

Onkel Dago" schrieb:
Wo bekommt man eigentlich so eine Kristallkugel her?

Eine dieser begehrten Kristallkugeln wird von Markus jedes Jahr auf dem Forumstreffen verlost, damit man eine Chance hat auch Fragen von DAU's zu beantworten *ROFL*

Aber putzen muss man die schon selber :ROFLMAO:

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, ich formuliere meine Frage mal anders.

Gibt es irgend eine sinnvolle Verwendung des Nullpointers "NIL" unter Step7 bzw. unter SCL? Dient er vielleicht "nur" als Dummy bei der Programmerstellung? Ich rufe z.Bsp. eine Funktion auf welche einen Pointer als Parameter benötigt. Der Pointer ist mir jedoch noch nicht bekannt und ich schreibe erst einmal "NIL" drann (um den Baustein übersetzen speichern zu können). Ist das alles, oder gibt es noch andere Verwendungen?


Gruß, Onkel
 
NIL wird normalerweise benutzt, um einen undefinierten
Wert zu signalisieren. Dass NIL bei SCL dasselbe wie NULL
ist, da kann Prof.N.Wirth nix für.

In C werden ja alle Variablen mit 0 initialisiert, auch die Pointer.
In Pascal (SCL ist Pascal?!) ist dem nicht so. Hier musst Du das selber erledigen. Überdies nennen sich Pointer hier Zeiger.


Gängig ist, wenn der Zeiger frisch ist, diesem den Wert NIL zuzuweisen.
So kann man ihn softwaretechnisch von einem benutzten
Zeiger unterscheiden...
 
Der Zeiger ins Nirwana

Hallo,

Onkel Dago schrieb:
Dient er vielleicht "nur" als Dummy bei der Programmerstellung? Ich rufe z.Bsp. eine Funktion auf welche einen Pointer als Parameter benötigt.

Auch das kann man nicht pauschal beantworten, ohne die Interna der aufgerufenen Prozedur/Funktion zu kennen. Das kann man unabhängig von der verwendeten Sprache so behaupten (egal ob SCL, C, C++, Pascal etc.).
Die eine Prozedur/Funktion prüft richtigerweise, ob ein Zeiger ins Nirwana zeigt und wird da ganz locker drüber wegspringen. Eine andere Prozedur/Funktion prüft das nicht und bringt Dein OS durch den NIL Pointer zum Absturz.
Grundsätzlich gilt : Eine Funktion/Prozedur kann einen NIL-Pointer akzeptieren und den entsprechend behandeln, eine Garantie dafür gibt es aber nicht...

Onkel Dago schrieb:
"NIL" drann (um den Baustein übersetzen speichern zu können).
Das wird jeder Compiler beim Übersetzen erstmal ohne zu maulen akzeptieren (sieht der Compiler erstmal als gültigen Wert an) , aber zur Laufzeit kriegst Du die Fehlermeldungen um die Ohren gehauen :ROFLMAO:

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf dem Weg ins Nirwana

Hallo,

argv_user schrieb:
NIL wird normalerweise benutzt, um einen undefinierten
Wert zu signalisieren. Dass NIL bei SCL dasselbe wie NULL
ist, da kann Prof.N.Wirth nix für.
Der Wert ist nicht undefiniert, sondern NULL (oder meinetwegen auch NIL). Die Definition des Wertes NULL ist also gewährleistet. Prof. Wirth ist zwar der Schöpfer der Programmiersprache Pascal (einfach genial), aber sein Einfluss auf SCL ist eben begrenzt, weil Siemens nur einen kleinen, rudimentären Vorrat der Möglichkeiten von Pascal in SCL implementiert hat.

argv_user schrieb:
In C werden ja alle Variablen mit 0 initialisiert, auch die Pointer.
In Pascal (SCL ist Pascal?!) ist dem nicht so. Hier musst Du das selber erledigen.

Einfach Quatsch, da hab ich doch wohl 25 Jahre etwas falsch gemacht ...

argv_user schrieb:
Überdies nennen sich Pointer hier Zeiger.
Ist C englisch und Pascal Deutsch ???

argv_user schrieb:
Gängig ist, wenn der Zeiger frisch ist, diesem den Wert NIL zuzuweisen.
So kann man ihn softwaretechnisch von einem benutzten
Zeiger unterscheiden...

Mich würde jetzt mal die Definition von einem "frischen Zeiger" interessieren...
Wenn Du mit GetMem einen Zeiger auf einen Speicherbereich anforderst, kriegst Du einen "frischen Zeiger" (solange die Ressourcen des OS reichen). Wenn Du den Speicher mit FreeMem wieder freigibst, kann der Zeiger noch irgendwo auf einen Speicherbereich zeigen (also ganz schön frisch sein), der Zugriff auf den Speicherbereich mit dem Zeiger wird Dein OS aber ins Nirwana schicken..
Im Gegensatz zu C kennt man in Pascal auch die Funktion "xx.FREEANDNIL", die tatsächlich nach der Freigabe eines Zeigers oder Objektes den Speicherbereich freigibt und den Zeiger wirklich auf NULL (oder NIL, wo ist da für Dich der Unterschied ???) setzt.

Gruß

Question_mark
 
Pointer

Hallo,

argv_user schrieb:
Gängig ist, wenn der Zeiger frisch ist, diesem den Wert NIL zuzuweisen.
So kann man ihn softwaretechnisch von einem benutzten
Zeiger unterscheiden...

Ähemm, habe mir das gerade noch mal durchgelesen und bin zu der Erkenntnis gekommen : So einen Blödsinn habe ich noch nirgendwo gelesen. Ich weiss zwar was Du ausdrücken willst, aber Du hast noch einen Versuch .:ROFLMAO:

Gruß

Question_mark
 
Nachdem bisher keiner die ursprüngliche Frage beantwortet hat:
Der FILL füllt den Bereich nicht, sondern liefert den Fehler 0x8124 (Bereichsfehler beim Lesen eines Parameters) - zumindest bei einer 318er CPU.


Ursache liegt darin, dass der nil-Pointer nur im ersten seiner zehn Bytes etwas von 0 Verschiedenes enthält - nämlich die 0x10 als Kennung für einen Anypointer. Alles andere, Typ, Anzahl, DB-Nummer, Bereichszeiger sind komplett mit 0 belegt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachdem bisher keiner die ursprüngliche Frage beantwortet hat:
Der FILL füllt den Bereich nicht, sondern liefert den Fehler 0x8124 (Bereichsfehler beim Lesen eines Parameters) - zumindest bei einer 318er CPU.


Ursache liegt darin, dass der nil-Pointer nur im ersten seiner zehn Bytes etwas von 0 Verschiedenes enthält - nämlich die 0x10 als Kennung für einen Anypointer. Alles andere, Typ, Anzahl, DB-Nummer, Bereichszeiger sind komplett mit 0 belegt.

Das ist doch gerade der SINN des NIL-Pointers.
Der ist nämlich als der ungültigste Pointer überhaupt definiert.
Die einzigen erlaubten Operationen sind die Zuweisung
und die Abfrage auf gleich oder ungleich...
 
Zuletzt bearbeitet:
Sfc 21

Hallo,

beim SFC21 sind "BVAL" (Input) und "BLK" (Output) Übergabeparameter als Zeiger auf einen Datenbereich. Ihr müsst schon selber dafür sorgen, diese Any-Pointer mit den Adressen des Speicherbereiches zu versorgen. Wie das geht wurde hier schon unzählige Male im Forum mit dem SFC20 BLKMOV als Beispiel beschrieben. Das will ich hier nicht wiederholen.
Also Ihr müsst schon die Any-Pointer mit den Adressen versorgen, sonst geht das doch nicht !

Gruß

Question_mark
 
Zurück
Oben