Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes.

Liknende presentasjoner


Presentasjon om: "ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes."— Utskrift av presentasjonen:

1 ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes

2 ADA95 for KDA Pakker  Ada har innebygget en mekanisme for å gruppere sammen underprogrammer som utfører en oppgave sammen, eller som utfører beslektede oppgaver.  Denne mekanismen kalles pakke, og kan sammenlignes med en klasse i C++ som man har et globalt objekt av, eller namespace.

3 ADA95 for KDA Pakker  Pakker deles i to biter: –Pakke spesifikasjonen –Pakke kroppen(body)  Vi har allerede støtt på en pakke: –text_io  Eksempel på en pakke.

4 ADA95 for KDA Pakke eksempel  Fil a.ads (Pakkespesifikasjonen) package a is procedure set(X: in integer); function get return integer; end a;

5 ADA95 for KDA  Fil a.adb (Pakkekroppen) with text_io; package body a is Remember : integer; procedure set(X: in integer) is begin Remember := X; end set; function get return integer is begin return Remember; end get;

6 ADA95 for KDA Slutten på pakkekroppen begin -- dette blir kjørt før pakka tas -- i bruk. Remember := 0; text_io.put_line("Starting"); -- utskrift som bevis på kjøring end a;

7 ADA95 for KDA Bruk av pakka with text_io; with a; procedure main is package int_io is new text_io.integer_io(integer); procedure p is begin int_io.put(a.get); text_io.put_line(""); a.set(100); int_io.put(a.get); text_io.put_line(""); end p;

8 ADA95 for KDA Bruk av pakka begin int_io.put(a.get); text_io.put_line(""); a.set(10); int_io.put(a.get); text_io.put_line(""); p; int_io.put(a.get); text_io.put_line(""); end main; Starting 0 10 100

9 ADA95 for KDA Gjeming av informasjon (Private typer)  Normale private typer  Begrensede private typer

10 ADA95 for KDA Private typer  Vi kan lage pakker uten private typer: package ComplexNumbers is type Complex is record Real,Imag : float; end record; function ”+” (X:Complex) return Complex; function ”+” (X,Y:Complex) return Complex; function ”-” (X:Complex) return Complex; function ”-” (X,Y:Complex) return Complex; end ComplexNumbers;

11 ADA95 for KDA eller med privat type. package ComplexNumbers is type Complex is private; function ”+” (X:Complex) return Complex; function ”+” (X,Y:Complex) return Complex; function ”-” (X:Complex) return Complex; function ”-” (X,Y:Complex) return Complex; private type Complex is record Real,Imag : float; end record; end ComplexNumbers;

12 ADA95 for KDA Pakkekroppen package body ComplexNumbers is function ”+” (X,Y:Complex) return Complex is begin return (X.Real+Y.Real,X.Imag+Y.Imag); end ”+”; ::::::::::::::::::: end ComplexNumbers;

13 ADA95 for KDA Bruk av ComplexNumbers with ComplexNumbers; procedure Main is a,b,c : ComplexNumbers.Complex; `begin a := b + c; Hvilken + er dette? a:=ComplexNumbers.+(b,c); a := b + c; use ComplexNumbers ;Type.Complex

14 ADA95 for KDA Arv (Subtype)  Vi kan gjøre slikt som: type Lengde is new Integer;  I dette tilfellet kan vi lage nye operatorer: function “+”(L,R : Lengde) return Lengde;  Men husk at dersom vi ikke lager nye operatorer arver vi alle fra integer.  Hva dersom vi ønsker å fjerne operatorer: function “*”(l,r:Lengde) return Lengde is abstract;

15 ADA95 for KDA Stack pakke package StackPak is type Stack is private; procedure Push(S: in out Stack; X:in integer); procedure Pop(S: in out Stack; X:out integer); function ”=”(S1,S2:Stack) return boolean; private MAX : constant := 100; type IntVec is array (integer range <>) of integer; type Stack is record Data: IntVec(1..MAX); Top : integer range 0..MAX := 0; end record; end StackPak;

16 ADA95 for KDA package body StackPak is procedure Push(S: in out Stack; X:in integer) is begin S.Top := S.Top + 1; S.Data(S.Top) := X; end Push; procedure Pop(S: in out Stack; X:out integer) is begin X := S.Data(S.Top); S.Top := S.Top - 1; end Pop; function ”=”(S1,S2:Stack) return boolean is begin if S1.Top /= S2.Top then return false; end if; return true; end ”=”; end StackPak;

17 ADA95 for KDA with StackPak; procedure main is MyStack : StackPak.Stack; Empty: StackPak.Stack; begin StackPak.Push(MyStack,Tall); StackPak.Pop(MyStack,Tall2); if (MyStack /= Empty) then MyStack := Empty; end if; end main;

18 ADA95 for KDA Limited private  Det er mulig å lage typer slik: type T is limited private;  Dette betyr at operatorene =, /= og := ikke automatisk er tilgjengelig for denne typen.

19 ADA95 for KDA Stack eksempel package StackPak is type Stack is limited private; procedure Push(S: in out Stack; X:in integer); procedure Pop(S: in out Stack; X:out integer); function ”=”(S1,S2:Stack) return boolean; private type Cell; type Stack is access Cell; type Cell is record Next: Stack; Value : integer; end record; end StackPak;

20 ADA95 for KDA package body StackPak is procedure Push(S: in out Stack; X:in integer) is begin S := new Cell’(S,X); end Push; procedure Pop(S: in out Stack; X:out integer) is begin X := S.Value; S := S.Next; end Pop; function ”=”(S1,S2:Stack) return boolean is begin ::::::::::::::: end ”=”; end StackPak;

21 ADA95 for KDA Løse enheter  Vi kan i ada dele ut funksjoner og prosedyrer i egene file. Dette gjøres ved: 1. Der kroppen til prosedyra skulle vært skrives: procedure X(parametre)is separate; 2. Lag en egen fil: separate(Pakkenavn) procedure X (Parametre) is --osv.

22 ADA95 for KDA Løse enheter  Løse enheter i gnat skal hete:  Pakkenavn~underprogramnavn.adb  Disse filene kompileres automatisk med.

23 ADA95 for KDA Child library units  Dette er en teknikk som benyttes dersom vi ønsker å lage en ny pakke som benytter private typer i en pakke, men der den nye koden ikke skal være en del av den gamle pakka.

24 ADA95 for KDA Eksempel package ComplexNum is type Complex is private; ::::::::: end ComplexNum; Package ComplexNum.Underpakke is function a(...) return Complex; end Complex.Underpakke;

25 ADA95 for KDA Bruk av underpakker  Dersom vi tar med oss en underrpakke slik: with ComplexNum.Underpakke;  Fører dette automatisk til at pakka ComplexNum også blir tatt med.

26 ADA95 for KDA Child library units  Det er mulig å lage underpakker som pakker inne i andre pakker: package P1 is package P2 is :::::::::::::::::: end P2; :::::::: end P1;

27 ADA95 for KDA Private Child lib-units  EN siste mulighet er å lage private underpakker.  Dette gjøres ved å skrive private forran package når vi lager pakka: package P1 is private package P2 is :::::::::::::::::: end P2; :::::::: end P1;

28 ADA95 for KDA Kort oppramsing av synlighetsregler  En pakkespesifikasjon behøver ikke benytte with ForreldrePakke;  En pakke spesifikasjon kan ikke benytte with Pakke.Barn;  En pakkebody kan benytte with Pakke.Barn og/eller Pakke.Bror  Ting i en forreldrepakke er synlig i barn. (use ikke nødvendig)

29 ADA95 for KDA Kort oppramsing av synlighetsregler  En privat barn er ikke synlig utenfor pakketreet.  Private deler og pakkekroppen til barnepakker kan benytte private deler av forreldrepakker.  Hele private barnepakker kan benytte private deler av forreldrepakker.  Use på en barnepakke fører til use på forreldrepakka også.  Use på en forreldrepakke fører til use på alle barnepakker som er inkludert med with.

30 ADA95 for KDA Forandring av navn  Det er mulig å bytte ut navnet på eksisterende enheter i ADA. declare procedure aset(X:integer) renames a.set; function rar return integer renames a.get; begin int_io.put(a.get); -- kan skrives som int_io.put(rar); end;

31 ADA95 for KDA På tide med oppgaver igjen Kap 11: 11.1, 11.3, 11.4 (1-4) og 11.5 (1-2) Kap 12: 12.1 og 12.3 Kap 5: 5.4 og 5.5 Kap 6: 6.2, 6.4. 6.6 og 6.8 Kap 7: 7.1 og 7.2 Kap 8: 8.1, 8.3, 8.6 og 8.7 Kap 9: 9.1 (1-3,7), 9.2 (1-2) og 9.3 Kap 10: 10.2, 10.3 og 10.6


Laste ned ppt "ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes."

Liknende presentasjoner


Annonser fra Google