Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20. i łączenie podprogramów a z programem napisanym w Ze względu na duże rozpowszechnienie języka, szczególnie w ośrodkach akademickich, oraz ze względu na potrzebę połączenia podprogramów napisanych w języku podane jest w tym rozdziale porównanie podstawowych własności obu języków. W celu poznania pełniejszych możliwości języka należy skorzystać z podręczników np. [1-3]. 20.1. Porównanie języków I Identyfikatory Identyfikatory w i u są takie same, za wyjątkiem: - nazwa w może rozpoczynać się również od znaku podkreślenia. - w u w przeciwieństwie do kompilator nie rozróżnia małych liter od dużych. Komentarz (* dowolny tekst *) /* dowolny tekst */ Typy danych INTEGER BOOLEAN HAR REAL int long int short int int char float double W u istnieją dane logiczne (boolowskie), które przyjmują wartość false lub true. W języku nie występuje typ boolowski. W wyrażeniach logicznych wyrażeniu o wartości całkowitej 0 odpowiada wartość logiczna false, natomiast wartości całkowitej różnej od zera odpowiada wartość logiczna true. Deklaracje zmiennych VAR i: INTEGER; c, d: HAR; x,y: REAL; int i; char c, d; float x,y; W u blok deklaracji zmiennych powinien rozpocząć się od słowa VAR. Różnice w zapisie operatorów arytmetycznych DIV / MOD %
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-2 Różnice występują przy oznaczeniu operatorów arytmetycznych dzielenia całkowitoliczbowego i dzielenia modulo. Różnice w zapisie operatorów logicznych = <> AND OR NOT ==!= &&! Instrukcja podstawiania i:= 2; c:= 'a'; x:= x + 2*x; i= 2; c= 'a'; x= x + 2*x; Instrukcja złożona instrukcja1... instrukcjan END i:= 2; c:= 'a'; x:= x + 2*x; END... instrukcja1 instrukcjan i= 2; c= 'a'; x= x + 2*x; Instrukcja sterująca if IF _boolowskie THEN IF _boolowskie THEN 1 ELSE 2 IF a>b THEN c:= a; IF a>b THEN max:= a ELSE max:= b if( ) ; if( ) 1 else 2 if( a>b ) c=a; if( a>b) max= a; else max= b; W języku nie występują zmienne logiczne. Wyrażenie w języku uznawane jest za prawdziwe, jeżeli wartość tego wyrażenia jest różna od zera, w przeciwnym razie takie traktowane jest jako fałszywe.
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-3 Instrukcja sterująca for FOR indeks:=start TO stop DO FOR i:= 1 TO 4 DO x:= x/2; for(wyr_pocz;wyr_konca;wyr_kroku) for( i= 1; i<=4; i++) x= x/2; Instrukcja i++ oznacza w języku podstawienie i= i+1; Instrukcja sterująca przełączająca (switch, case) ASE OF k1, k2,..., kk: 1;... m1, m2,..., mm: N; ASE ch OF '1': y:= sin(x); '2','3': y:= sqrt(x); '4','5','6':y: = cos(x); switch( ) case k1: case k2:... case KK: wyrazenie1;... case m1: case m2: case mm: N; default: D; switch(ch) case '1': y= sin(x); case '2': case '3': y= sqrt(x); case '4': case '5': case '6': y= cos(x); W języku instrukcja switch-case może zawierać pozycję default, której jest wykonywane, jeżeli żaden z wcześniejszych warunków nie został wykonany.
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-4 Instrukcja sterująca while WHILE _boolowskie DO WHILE x>max DO x:= x-dx while( 1 ) 2; while( x>xmax) x= x-dx; Instrukcja sterująca powtarzania (repeat lub do) REPEAT do UNTIL while( warunek) warunek REPEAT x:= x-dx; UNTIL x>xmax do x= x-dx; while( x>xmax) Definicja funkcji FUNTION max(a, b:integer):integer IF a>b THEN max:= a; ELSE max:= b; int max( a, b) int a, b; if( a>b 0 return(a); else return(b); Definicja procedur PROEDURE oblicz; void oblicz( void ) VAR x: INTEGER; int x; x:= x+7; x= x+7; W języku podprogramy przedstawiane są za pomocą funkcji. Jeżeli funkcja nie zwraca wartości, to podaje się, że funkcja jest typu void. Program główny PROGRAM LIZ; VAR i, j: INTEGER; i= 7; j= i+34; END. main int i, j; i= 7; j= i+34; W języku program główny nosi zawsze nazwę main.
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-5 Tablice VAR tab: ARRAY[0..wymiar-1] OF typ; VAR wekt: ARRAY[0..9] OF INTEGER; VAR x: ARRAY[0..8,0..8] OF INTEGER; x[2,1]:= x[1,2]; typ tab[wymiar]; int wekt[10]; int x[9][9]; x[2][1]= x[1][2]; W języku pierwszy element tablicy posiada zerowe indeksy, każda tablica rozpoczyna się z elementem o indeksie równym 0 (lub indeksach równych zero w przypadku tablic wielowymiarowych). Definicja zmiennych wskaźnikowych VAR id = ^INTEGER; int *id; VAR wsk= ^INTEGER; Wartość wskaźnika pustego NIL int *wsk; NULL Przydzielenie i zwolnienie pamięci na stercie VAR ptr: ^typ; typ *ptr; NEW(ptr); ptr= (typ*)malloc(sizeof(typ)); DISPOSE(p); free(ptr); VAR int_ptr: INTEGER; NEW(int_ptr); DISPOSE(int_ptr); Zmienne rekordowe VAR r: REORD składniki; int *int_ptr; int_ptr= (int *)malloc( sizeof(int) ); free( int_ptr); struct składniki; r; TYPE prac: REORD nazwisko: array [0..19] OF HAR; wiek: INTEGER; struct char nazwisko[20]; int wiek; prac;
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-6 Typy rekordowe TYPE typ = REORD składniki; TYPE student= REORD nazwisko: array [0..19] OF HAR; wiek: INTEGER; ocena: INTEGER; VAR st1, st2: STUDENT; VAR lista: ARRAY[0..99] OF STUDENT; struct typ składniki; ; struct student char nazwisko[20]; int wiek; int ocena; ; struct student st1, st2; struct student lista[100]; Typ wyliczeniowy TYPE kolor= typedef enum (niebieski, bialy, zielony); niebieski, bialy, zielony kolor; 20.2. Wykorzystanie podprogramów języka w programie napisanym w języku Język stwarza możliwość łączenia z innymi językami poprzez łączenie modułów skompilowanych o rozszerzeniu OBJ. Wiele języków ma możliwość kompilacji modułów do tej postaci, co stwarza możliwość łatwego połączenia. Modułem głównym może tu być program w lub moduł w innym języku. Turbo nie posiada możliwości kompilowania programu do postaci OBJ, a jedynie do postaci TPU lub oczywiście EXE. Nie jest więc możliwe bezpośrednie łączenie modułów skompilowanych języka i. Wywołanie podprogramów języka z poziomu języka W celu dołączenia do programu w u fragmentu napisanego w języku, należy ten fragment skompilować do postaci OBJ, a następnie dołączyć do programu napisanego w języku poprzez użycie dyrektywy: $L nazwa_programu.obj która spowoduje dołączenie skompilowanego modułu z. Jeżeli z programu ma być wywołana funkcja napisana w, to muszą być dodatkowo spełnione następujące warunki: 1. w programie napisanym w Turbo u deklarujemy funkcję jako external, np.: function GetMode: Word; external; procedure SetMode(Mode: Word); external; 2. w programie w deklarujemy tą funkcję z modyfikatorem _pascal. Zastosowanie modyfikatora spowoduje zmianę nazwy przez kompilator tej funkcji na duże litery. Nazwa ta nie zostanie poprzedzona znakiem '_'. Przekazywanie danych na stos dokonane zostanie w konwencji a.
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-7 Przykłady deklaracji: char _pascal far GetMode( void ); void _pascal far SetMode( int Mode ); Funkcje napisane i dołączane do modułu TPU muszą być zadeklarowane jako far lub near w zależności od tego, czy są eksportowane czy nie. Wywołanie podprogramów języka z poziomu języka Załóżmy, że podprogramy języka znajdują się w segmentach skompilowanych lub bibliotecznych skompilowanych. Wtedy, aby można było skorzystać z tych funkcji w programie napisanym w języku, muszą być spełnione następujące warunki: 1. W module źródłowym języka należy zadeklarować podprogramy języka jako funkcje zewnętrzne (extern) z modyfikatorem _pascal. Spowoduje to zmianę dokonaną przez kompilator nazwy funkcji na duże litery, nazwa ta nie będzie poprzedzona znakiem '_'. Stosowane będzie przekazywanie danych do odłożenia na stos w konwencji a. Przykład deklaracji funkcji w programie źródłowym języka : external int _pascal far Funkcja( int a ); W zależności od tego, czy wywołana funkcja a jest funkcją eksportowaną z modułu TPU, czy nie (lub znajduje się w module głównym), musi być zadeklarowana odpowiednio jako far lub near. 2. Przyłączana funkcja musi być zadeklarowana w u na poziomie globalnym. Przykład 20.1. Poniżej podano przykład programu stosującego metodę szybkiego sortowania. Należy zwrócić uwagę na możliwość zagnieżdżania funkcji. Funkcja zagnieżdżona ma zakres lokalny wewnątrz funkcji. program QSort; uses rt; const Max = 10; type List = array[1..max] of Integer; var Data: List; I: Integer; procedure QuickSort(var A: List; Lo, Hi: Integer); procedure Sort(l, r: Integer); var i, j, x, y: integer; begin i := l; j := r; x := a[(l+r) DIV 2]; repeat while a[i] < x do i := i + 1; while x < a[j] do j := j - 1; if i <= j then begin y := a[i]; a[i] := a[j]; a[j] := y; i := i + 1; j := j - 1; end; until i > j;
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20-8 if l < j then Sort(l, j); if i < r then Sort(i, r); end; begin QuickSort; Sort(Lo,Hi); end; begin QSort - Sortowanie tablic Write('Generowanie tablicy do posortowania...'); Randomize; for i := 1 to Max do Data[i] := Random(30000); Writeln; Write('Sortowanie tablicy...'); QuickSort(Data, 1, Max); Writeln; for i := 1 to 1000 do Write(Data[i]:8); end. Literatura: [1] Andrzej Marciniak: Turbo. Warszawa, PWN 1994 [2] Mueldner T., Steele P. W.: as a Second Language. For Native Speakers of. Addison Wesley Publ. ompany, 1990 [3] Wajs W.: Programowanie w Turbo u. Skrypt AGH 1298, Kraków 1991 Ćwiczenia: 1. Należy napisać odpowiednik programu z przykładu 20.1, ale w języku. Następnie należy rozważyć, co należy zrobić, by procedura sortowania napisana w jednym języku programowania była wykorzystywana w drugim języku.