8 Zugriffstypen ( Zeiger )



Ähnliche Dokumente
Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Objektorientierte Programmierung

Programmierung in C. Grundlagen. Stefan Kallerhoff

Erwin Grüner

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

7.3 Einrichtung 13. Monatslohn. Auszahlung Ende Jahr / Ende der Beschäftigung

Gesicherte Prozeduren

Diana Lange. Generative Gestaltung Operatoren

Einführung in die Programmierung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Über Arrays und verkettete Listen Listen in Delphi

Algorithmen und Datenstrukturen

Einführung in die Java- Programmierung

Erstellen von x-y-diagrammen in OpenOffice.calc

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Java Virtual Machine (JVM) Bytecode

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Lehrer: Einschreibemethoden

NODELOCKED LIZENZ generieren (ab ST4)

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

7 Rechnen mit Polynomen

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Erfahrungen mit Hartz IV- Empfängern

Abwesenheitsnotiz im Exchange Server 2010

Javakurs zu Informatik I. Henning Heitkötter

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Modellierung und Programmierung 1

Professionelle Seminare im Bereich MS-Office

Anleitung für die Teilnahme an den Platzvergaben "Studio II, Studio IV und Studio VI" im Studiengang Bachelor Architektur SS15

Anleitung Postfachsystem Inhalt

S7-Hantierungsbausteine für R355, R6000 und R2700

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten!

Anleitung vom 4. Mai BSU Mobile Banking App

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Vorkurs C++ Programmierung

6. Benutzerdefinierte Zahlenformate

Prozedurale Datenbank- Anwendungsprogrammierung

Kundenspezifische Preise im Shop WyRu Online-Shop

Datenbanken Microsoft Access 2010

Win-Digipet V 9.2 Premium Edition Wie bastele ich mir steuerbare Kontakte. Wie bastele ich mir steuerbare Kontakte? -Quick-And-Dirty-Lösung-

Dokumentenverwaltung im Internet

Gleichungen und Ungleichungen

Einführung in die Programmierung für Wirtschaftsinformatik

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Scala kann auch faul sein

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Übungen Programmieren 1 Felix Rohrer. Übungen

Rundung und Casting von Zahlen

SCHRITT 1: Öffnen des Bildes und Auswahl der Option»Drucken«im Menü»Datei«...2. SCHRITT 2: Angeben des Papierformat im Dialog»Drucklayout«...

Bevor lineare Gleichungen gelöst werden, ein paar wichtige Begriffe, die im Zusammenhang von linearen Gleichungen oft auftauchen.

Graphic Coding. Klausur. 9. Februar Kurs A

Programmierkurs Java

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

6 Systematisches Testen von Programmen

Nutzung des Retain-Archivs

Leere Zeilen aus Excel-Dateien entfernen

Lineare Gleichungssysteme

1 BEDIENUNGSANLEITUNG

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Bedienungsanleitung - Webtool

Zählen von Objekten einer bestimmten Klasse

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Internationales Altkatholisches Laienforum

5 Zweisprachige Seiten

FIS: Projektdaten auf den Internetseiten ausgeben

BEDIENUNGSANLEITUNG: EINREICH-TOOL

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Process4.biz Release Features Übersicht. Repository. Das Schützen von Diagrammen wurde optimiert (check-in, check-out)

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Ihr Ideen- & Projektmanagement-Tool

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Eigenwerte und Eigenvektoren von Matrizen

Was ist Logische Programmierung?

AutoCAD Dienstprogramm zur Lizenzübertragung

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Excel Funktionen durch eigene Funktionen erweitern.

Hilfedatei der Oden$-Börse Stand Juni 2014

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Modul 122 VBA Scribt.docx

PowerPoint: Text. Text

Info-Veranstaltung zur Erstellung von Zertifikaten

Browsereinstellungen für moneycheck24 in Explorer unter Windows

Word 2010 Schnellbausteine

Arbeiten mit UMLed und Delphi

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Datenbanken Kapitel 2

Transkript:

8 Zugriffstypen ( Zeiger ) 1. Zugriffstypen, die auf Daten in einem Storage Pool zeigen Heap. 2. Allgemeine Zugriffstypen, die auf (mehr oder weniger) beliebige Daten zeigen. 3. Zugriffsparameter für Unterprogramme 4. Zugriffstypen, die auf Unterprogramme zeigen. Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.1/28

1. Storage Pools Jeder Zugriffstyp (d.h., jede Definition type... is access... ) definiert einen Storage Pool, aus dem bei Bedarf Objekte des ensprechenden Typs alloziert werden. Dies bedeutet nicht, dass bestimmte Teile des Speichers fest für Daten eines bestimmten Typs reserviert werden das wäre arg verschwenderisch. Unterschiedliche Storage Pools können sich unterschiedlich verhalten (z.b. können bestimmte Storage Pools mit, andere ohne Garbage Collection arbeiten). In jedem Fall wird der allozierte Speicherplatz wieder freigegeben, wenn die Lebensdauer des Storage Pools (d.h., des zugehörigen Zugriffstyps) zu Ende ist. Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.2/28

Definition einer Linearen Liste type Cell; type Cursor is access Cell; type Cell is record Content: Element; Next: Container; end record; type Container is new Cursor; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.3/28

Auftretende Typen Cell: Datenzelle, bestehend aus Inhalt (vom Type Element) und Container (Zeiger auf nächste Zelle. Container, Cursor: Zeiger auf (irgend) eine Zelle Hinweise: Niemals Zelle verwechseln mit Zeiger auf Zelle!!! Container und Cursor Cursor sind strukturell gleich, in Ada aber verschiedene Typen, inbesondere nicht Zuweisungskompatibel. type Container is new Cursor; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.4/28

Einfügen in Lineare Liste procedure Put (Cont: in out Container; Item: in Element) is begin Cont := new Cell (Item, Cont); exception when Storage_Error => raise SL.Containers.Overflow; end Put; Was tut diese Prozedur genau? Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.5/28

Allokation und Zugriff Fordere neuen Speicherplatz vom Typ Cell aus einem Storage Pool an: Mit Initialwerten: new Cell (Item, Cont); Ohne Initialwerte: new Cell; Zugriff auf den Zeiger Cont: Cont.Content: Element Cont.Next: Zeiger auf nächste Zelle Cont.all: ganzer record vom Typ Cell Cont: Zeiger auf aktuelle Zelle Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.6/28

Entfernen aus Linearer Liste procedure Get (Cont: in out Container; Item : out Element) is begin if Cont = null then raise SL.Containers.Underflow; else Item := Cont.Content; Cont := Cont.Next; -- no De-Allocation implemented! end if; end Get; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.7/28

De-Allokation von Speicher 3 Möglichkeiten: 1. Explizites De-Allozieren mit Hilfe von Ada.Unchecked_Deallocation. 2. Automatische De-Allozieren des Speichers, wenn der entsprechende Zugriffstyp out of scope gerät. 3. Automatische Suche nach unbenutztem Speicher ( Garbage Collection, GC). (Erlaubt, aber nicht vorgeschrieben!) Die meisten Ada-Compiler unterstützen keine GC. Warum eigentlich? Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.8/28

Programmfragment (1) with Ada.Text_IO; use Ada.Text_IO; type Cell; type Cursor is access Cell; type Cell is record X: Integer; Next: Cursor; end record; L, N: Cursor; L := new Cell (10, null); N := new Cell (10, null); Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.9/28

Programmfragment (2) for I in 1.. 2 loop Put_Line("1. " & Boolean Image(L = N)); Put_Line("2. " & Boolean Image(L.X = N.X)); Put_Line("3. " & Boolean Image(L.Next = N.Next)); Put_Line("4. " & Boolean Image(L.all = N.all)); L := N; end loop; Was leistet diese Programmfragment? Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.10/28

Was geschieht hier? with Ada.Text_IO; use Ada.Text_IO; type Cell; type Cursor is access Cell; type Cell is record X: Integer; Next: Cursor; end record; L, N: Cursor; L := new Cell (10, null); N := new Cell (20, L); L.Next := N; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.11/28

Zeiger auf beliebige Typen (1) Zugriffstypen müssen nicht immer nur auf records zeigen: procedure Unbounded_Array is type Feld is array (Positive range <>) of Integer; type Feld_Access is access Feld; package PIO is new Ada.Text_IO.Integer_IO(Positive); P: Positive; A: Feld_Access; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.12/28

Zeiger auf beliebige Typen (2) begin PIO.Get(P); A := new Feld(1.. P); A.all := (1 => 1, 2 => 1, others => 0); for I in 3.. P loop A(I) := A(I-1) + A(I-2); end loop; Ada.Text_IO.Put_Line(Integer Image(A(P))); end Unbounded_Array; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.13/28

Zeiger auf beliebige Typen (3) Wir können nicht A := new Feld; schreiben! Das ganze Feld, auf das A zeigt, erhalten wir mit A.all! Entsprechend auch Zeiger auf andere Typen definieren, z.b. hlkeytype AI is access Integer; X: AI;... X := new Integer; X.all := 13; Aber AI kann nicht auf eine normale Integer-Variable zeigen... Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.14/28

2. Allgemeine Zugriffs-Typen (1) procedure Play_Array is type Feld is array (1.. 2048) of Integer; type Feld_Access is access all Feld; A: Feld_Access; B: aliased Feld; begin A := B Access; A.all := (1 => 1, others => 2); for I in 2.. A.all Last loop A(1) := A(1) + A(I); end loop; Ada.Text_IO.Put_Line(Integer Image(A(1))); end Play_Array; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.15/28

Allgemeine Zugriffs-Typen (2) Der Zugriffs-Typ (Zeiger) muss mit access all definiert werden. Alternative: access all ( nächste Folie) Der Typ, auf den gezeigt werden soll, muss mit aliased definiert werden. Warum ist das sinnvoll? Wird kein Speicherplatz alloziert (new), muss man sich um die De-Allokation nicht kümmern. Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.16/28

Allgemeine Zugriffs-Typen (3) type Constant_String_Access is access constant String; type Texts_Type is array (Positive range <>) of Constant_String_Access; Bad_In: aliased constant String := "Too many fingers on keyboard!"; Pre_V: aliased constant String := "Procondition Violated!"; Post_V: aliased constant String := "Postcondition Violated!"; Texts: Texts_Type := (Bad_In Access, Pre_V Access, Post_V Access); Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.17/28

Allgemeine Zugriffs-Typen (4) with Ada.Text_IO; procedure was_mache_ich is type AI is access all Integer; A: AI; begin declare B: AI; I: aliased Integer := 13; begin B := I Access; A := B; end; Ada.Text_IO.Put_Line(Integer Image(A.all)); end was_mache_ich; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.18/28

Allgemeine Zugriffs-Typen (5) Regel zur Vermeidung von dangling Pointers: Ein Zeiger kann niemals auf eine Variable zugreifen, deren Lebenszeit kürzer ist als der Typ des Zeigers! Bei Bedarf kann man das Attribut Unchecked_Access verwenden mit Vorsicht! Was würde was_mache_ich tun, wenn wir B := I Access; durch B := I Unchecked_Access; ersetzen würden? Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.19/28

3. Zugriffs-Parameter (1) with Ada.Text_IO; procedure access_play is procedure P (Ptr: access Integer)is begin Ada.Text_IO.Put_Line (Integer Image(Ptr.all)); end P; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.20/28

Zugriffs-Parameter (2) type AI is access all Integer; A: AI; type BI is access Integer; B: BI; I: aliased Integer := 13; begin A := new Integer (17); B := new Integer (32); P(I Access); P(A); P(B); end access_play; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.21/28

Zugriffs-Parameter (3) Zugriffsparameter sind spezielle in-parameter, wobei das Schlüsselwort access an die Stelle von in tritt. Insbesonder dürfen auch Funktionen Zugriffsparameter definieren (während Durchgangs- oder Ausgangsparameter bekanntlich verboten sind). Beispiel: Nächste Folie. Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.22/28

Zugriffs-Parameter (4) Ein Typ T, der durch type T is access Some; definiert wurde, kann wie gewohnt als beliebiger Parameter an eine Prozedur übergeben werden: procedure P( A: in T; B: out T; C: in out T; D: access T; E: access Some ); Was ist der Unterschied zwischen access T und access Some? Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.23/28

4. Zugriff auf Unterprogramme (1) type Do_Element is access procedure(e: Element); procedure Iterate(The_Cont: Container; Do_It: Do_Element); S_All: Integer; procedure Do_All(I: Integer) is begin S_All := S_All + I; end Do_All; Iterate(Cont, Do_All access); Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.24/28

Zugriff auf Unterprogramme (2) procedure Iterate(The_Cont: Container; Do_It: Do_Element) is Cur: Cursor; E: Element; begin Cur := First (The_Cont); loop E := Pick (The_Cont, Cur); Do_It(E); Cur := Next (The_Cont, Cur); end loop; exception when SL.Containers.Iteration_End => null; end Iterate; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.25/28

Zugriff auf Unterprogramme (3) Es gelten die gleichen Regel zur Vermeidung von dangling Pointers: Ein Zeiger kann niemals auf eine Prozedur zeigen, deren Lebenszeit kürzer ist als der Typ des Zeigers! Dies bedeutet, dass wir eine lokale Prozedur nicht als Parameter einer mehr global definierten Prozedur übergeben können... Diese Restriktion von Ada95 soll Ada2005 lockern. Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.26/28

Zugriff auf Unterprogramme (4) type Button; type Response is access procedure (B in out Button); type Button is record Do_This: Response;... end record; Procedure Push(B: in out Button) is begin B.Response(B); end Push; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.27/28

Zugriff auf Unterprogramme (5) procedure Emergency(B: in out Button) is begin Engines(Zero_Power); Breaks(Maximum_Power); Call_Pilot(B.Name); end Emergency; procedure Emergency_Call(B: in out Button) is begin Call_Pilot(B.Name, urgent => true); end Emergency; Red_Button.Do_This: Button := Emergency access; Red_Button.Do_This := Emergency_Call access; Stefan Lucks, Software-Entwicklung für Sichere Systeme SS 04, Kapitel 8 p.28/28