Z A D A N I E | |||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ||
Z E S T A W |
I | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
II | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
III | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
IV | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
V | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
VI | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
VII | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
VIII | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
IX | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
X | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
XI | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
XII | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | |
XIII | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Strona 23.
[ spis ]Zdarzenie to zjawisko wymagające reakcji przez program (str.23). Żeby dołączyć w środowisku Delphi kod obsługi zdarzenia komponentu trzeba wybrać komponent, przejść na zakładkę Events w okienku Object Inspector i kliknąć dwukrotnie wybrane zdarzenie. Wtedy w module związanym z daną formatką (na której jest wybrany komponent) dodana zostanie metoda - pojawi się jej szkielet, w której można wpisać kod obsługi zdarzenia. Tą metodę można też wpisać ręcznie (trzeba znać parametry przekazywane do obsługi zdarzenia) i później powiązać ją z wybranym zdarzeniem.
[ spis ]Strona 85/86.
[ spis ]Strona 107.
[ spis ]
Przykład 5.14 ze strony 150.
Przy wykonaniu f:=funkcja(wsk) zostanie przypisana do zmiennej f
wartość wskaźnika wsk. Natomiast wykonując funkcja(wsk):=f
do zmiennej wskaźnikowej wsk zostanie przypisany adres pamiętany
w zmiennej proceduralnej f.
W obu przypadkach funckja(wsk) jest zmianą typu zmiennej w odwołaniu,
co po prostu umożliwia takie przypisania. Bez tego nie byłyby one możliwe,
ponieważ typy wskaźników (bo obie zmienne są w rzeczystości zmiennymi wskaźnikowmyi)
nie są ze sobą zgodne.
Strona 185/186.
[ spis ]Strona 195/196.
[ spis ]
Strona 328/329.
Mogę dodać tylko tyle, że jeśli podać coś po słowie name to w DLL'u szukana
jest procedura/funkcja eksportowana przez podaną nazwę (analogicznie
z index). Jeśli nic się nie poda to tak jakby podać po name
identyfikator zadeklarowanej przez nas procedury (oczywiście w apostrofach).
Strona 228.
Dodam, że są to dość dziwne parametry. Nie są zgodne z żadnym typem, ich
użycie jest jedynie możliwe przez zmianę typu zmiennej w odwołaniu.
Różnią się od parametrych otwartych znacznie. Argumentami, odpowiadającymi
parametrom nieokreślonego typu mogą być zmienne (lub wyrażenia) dowolnego typu.
Natomiast argumentami odpowiadającymi parametrom otwartym są tablice (ewentualnie
pojedyńcza zmienna) dowolnej wielkości, ale określonego typu.
Przykład 13.42/4 ze strony 467/468.
Na ekranie zostanie wypisane:
Object 0 1,2 2 Object 0 1,2 Object 0 1,2 2
Warto przy tym zauważyć, że wszystkie elementy tablicy wariantowej (jak i wszystkie zmienne wariantowe) są wypisane w dziwnie ludzkim języku. Zamiast FALSE pojawiło się po prostu 0 oraz zamiast 1.20000000000000E+0000 pokazało się 1,2 (z przecinkiem, a nie kropką - to podobno zależy od ustawień regionalnych).
[ spis ]Jak na mój gust to różnica jest duża. Formatka (str.23) to okienko, na którym w procesie tworzenia programu można umieszczać różne komponenty i związany jest z nią pewien moduł programowy. Komponent (str.23) to element łącza użytkownika umieszczany na formatce (lub z nią powiązany) i jest reprezentowany przez obiekt programowy.
[ spis ]Strona 75/76/77.
[ spis ]
Strona 101/102/103.
Warto zapamiętać, że są łańcuchy krótkie definiowane przez samo słowo kluczowe
string przy dyrektywie $H-, albo też przez
string[rozmiar] lub identyfikator ShortString, niezależnie
od stanu dyrektywy $H. Natomiast łańcuchy długie definiuje się przez
słowo kluczowe string przy $H+ lub przez identyfikator
AnsiString (niezależnie od $H).
Strona 129 i strona 132.
[ spis ]Przypisanie jest niemożliwe ponieważ do zmiennych poceduralnych nie można przypisywać procedur i funkcji z modułu System (str.142, ostanie zdanie pierwszego akapitu). Żeby zrealizować cel należy zdefiniować frunkcję:
function Sin(x: Extended): Extended; begin Sin:=System.Sin(x); end;Wtedy można przypisać xyz:=Sin; [ spis ]
Strona 158/159.
Rozmawiałem z dhAM i najważniejsze dla niego jest to, że każdy element definicji
wyrażenia (chodzi mi o składnik, wyr.proste, wyrażenie) jest albo samym elementem
stopnia niższego (dla składnika jest to czynnik, ...) albo połączeniem
tych elementów odpowiednimi operaotrami (dla składnika jest to
operator multyplikatywny, ...). Jeśli chodzi o definicję czynnika to wystarczy
wymienić najważniejsze (nie wszystko, ale byle bez błędów). Myślę, że
najważeniejsze to:
odwołanie do zmiennej, wyrażenie w nawiasach, stała bez znaku, czynnik poprzdzony
+,-,not, wywołanie funkcji.
Oczywiście definicję (lekko okrojoną) należy przedstawić w rekurencyjnej postaci
(jak w książce), a przypadkiem nie tak jak przeze mnie (bo to nie jest definicja).
Strona 198/199.
Przestudiujcie tą definicję porządnie, bo dhAM zawsze przy niej ostro chrząka
i będzie wymagał jej dość dokładnie.
Strona 296.
[ spis ]
Strona 310/311.
Wystarczy przeczytać 2 zdania z 310 i przeskoczyć do rozdziału z 311.
Ale uwaga: własności nie służą do przechowywania danych, a jedynie określają sposób
ich wymiany z obiektem (i ewentualnie przedstawiają czynności wykonywane
podczas tej wymiany).
Po pierwsze nie ma różnicy czy identyfikator jest typem, czy zmienną danego typu -
funkcje High i Low zachowują się tak samo.
Po drugie High i Low zwracają największą i najmniejszą wartość
jakie może przyjąć zmienna podanego typu, a dla tablic zwracają
największy i najmniejszy indeks tablicy.
Po trzecie te funkcje zwracają wartość typu zgodnego z podanym jako parametr.
Jeśli podana zmienna/typ jest tablicą to zwracają wartość zgodną z typem
indeksowym tej tablicy. Może być to liczba, znak, True, False
lub identyfikator typu wyliczeniowego.
Jeśli chodzi o tablicę dwuwymiarową to wygląda to tak:
array [-2..10,'a'..'z'] of Double jest tym samym co
array [-2..10] of array ['a'..'z'] of Double
a to jest
array [-2..10] of COŚTAM, - nie interesuje nas czego to jest
tablica (nieważne, że jej elementy to też tablice).
Podobnie z drugą tablicą:
array [Boolean] of array[-10..-1] of Integer
to jest
array [Boolean] of COŚTAM - analogicznie j.w.
Czy już wiecie co będzie wynikiem?
Komponenty widoczne wyglądają na formatce tak samo w fazie prokektowania jak i po uruchomieniu programu (np.Button,Edit,Memo,...). Obecność komponentów niewidocznych jest zaznaczona na formatce jedynie przez mały kwadratowy piktogram :-), który podczas wykonywania programu nie pojawia się, ale można wywołać zdarzenia z nim związane (lub otworzyć jakieś okno, itp.). Są to np.: OpenDialog, SaveDialog, DataSource, ... .
[ spis ]
Strona 78/79.
Jeśli chodzi o słowa kluczowe to warto zapamiętać ostatnie dane na str.78 (raczej
nie trzeba uczyć się wszystkich słów). Jeśli chodzi o dyrektywy języka to
drugie zdanie ze str.79 chyba jest najważniejsze. Z tych zdań wynikają różnice.
Strony 94-100.
Stron wydaje się trochę dużo, ale wystarczy znać podstawowe informacje
o definiowaniu poszczególnych typów porządkowych. Trzeba też pamiętać, że
wszystkie typy rzeczywiste są już predefiniowane (Real, Single, Double, Extended,
Comp, Currency).
Strona 113.
[ spis ]
Przykład 8.4/1 ze strony 239.
Pierwszy element tablicy (przekazanej jako parametr otwarty) ma indeks 0,
a ostatni można pobrać funckją High.
Drugą część zadania należałoby wykonać używając tzw. konstruktora tablicy:
suma([m+2,1234,n-1]). Niestety jest to niemożliwe dla parametrów
var (a taki jest w treści zadania). Wtedy trzeba zadeklarować
trzyelementową tablicę (o elementach całkowitych), przypisać do jej kolejnych
wyrazów wartości wymienionych wyrażeń i ją przekazać jako parametr.
Strona 327.
[ spis ]Strona 201/202/203.
[ spis ]Strona 207/208/210/216.
[ spis ]
Strona 226.
Jedyna (poza deklaracją) różnica między tymi parametrami jest taka, że
parametry przekazywane przez stałą
są tylko do odczytu (kompilator oburza się gdy przypisze się do nich jakąś wartość).
Przykład podobny do przykładu 12.12 ze strony 371.
Jednak należy wykonanie całości programu uzależnić od warunku ParamCount=2
(sprawdzenie czy zostały podano dokładnie 2 parametry). Później zamiast wczytywać
nazwy plików przy użyciu Readln należy użyć funkcji ParamStr, która
zwraca parametr o numerze podanym jako argument funkcji.
I jeszcz mały drobiazg. Program z książki kopiuje całkowitą wielokrotność
bloku (domyślnie 128). Żeby skopiował cały plik, to trzeba otworzyć plik z blokiem
wielkości 1: Reset(zbior_pierwotny,1); Rewrite(zbior_docelowy,1);.
Wtedy jako parametr w procedurze BlockRead można podać np. 128 (zamiast 1).
Zasygnalizowałem już ten problem dhAM.
Procedura może wyglądać następująco:
procedure Rozdziel; var i: Byte; begin n:=[]; p:=[]; for i:=0 to 255 do if i in a then if Odd(i) then Include(n,i) else Include(p,i) end;
Zmienne n i p też powinny być typu set of Byte. Mogą być (może nawet powinny być) przekazywane jako parametry wyjściowe z procedury.
[ spis ]
Strony 318..323.
Wystarczy znać jedynie strukturę poszczególnych części (pierwsze kilka zdań
z każdego rodziału).
Przykład podobny do 12.7/1 ze strony 360.
Podany zbiór dyskowy będzie miał 2 bajty i będzie zawierał zakodowaną w postaci
binarnej liczbę typu Word o wartości 43210. Konkretnie pierwszy bajt
w pliku będzie miał wartość 202, a drugi 168 (jest tak ponieważ 202+256*168=43210).
Strona 408/409.
Chciałbym zaznaczyć, że procedura tworzenia i dołączenia kolejki to jedna
procedura (nie dwie osobne), która albo tworzy kolejkę (gdy jej nie ma), albo
dodaje na jej koniec element (gdy jest).
Strona 287 i strony 302-304.
[ spis ]Typy proste nie będące typami porządkowymi to po prstu typy rzeczywiste. Typy rzeczywiste są predefiniowane i są to: Real, Single, Double, Extended oraz Comp, Currency.
[ spis ]Na ekranie ukaże się:
x = 7 z = 7 x = 5 y = 7
Chyba widać co się dzieje wewnątrz procedury pisz i dlaczego pierwsze
2 linijki są wypisane tak, a nie inaczej. Niektórych (ale tylko niektórych)
może jedynie zastanawiać dlaczego tak się dzieje, jak się dzieje poza procedurą.
Parametry przekazywane przez wartość (podobnie przez stałą), jakim jest pierwszy
parametr mimo zmian wewnątrz procedury są zapominane po jej zakończeniu. Dlatego
zmienna globalna x ma taką samą wartość zarówno przed, jak i po jej
wykonaniu.
Natomiast inaczej to wygląda z drugim parametrem, który jest parametrem
przekazywanym przez zmienną. W ich przypadku pamiętane jest wszystko co
się z nimi działo wewnątrz procedury. Dlatego właśnie zmienna globalna y
po wykonaniu pisz ma inną wartość niż przed wykonaniem. Wygląda to tak,
że parametr z dostaje na dzień dobry taką wartość jaką ma y,
a po zmianie parametru z zmienia się też zmienna y.
Strona 400 i przykład 13.7/2 ze strony 401.
[ spis ]Strona 84.
[ spis ]Strona 192 i strona 193/195/196.
[ spis ]
Strona 228.
Poza sposobem deklaracji warto zwrócić uwagę na parę rzeczy. Parametr wewnątrz
procedury jest zawsze tablicą jednowymiarową indeksowaną od 0 (numer ostatniego
elementu można przez funkcję High). Parametr aktualny (podawany przy
wywołaniu procedury) może być tablicą jednowymiarową, wielowymiarową lub nawet
pojedyńczą zmienną - ale określonego typu (podanego przy deklaracji parametru).
:-)
[ spis ]
Rekord składa się z dwóch pól stałych (a typu Integer oraz
b typu Boolean). Składa się także z pól wariantowych -
w zależności od wariantu, z dwóch pól, obu typu Real lub dwóch
pól, z których jedno jest Real, a drugie Char.
Zmieniając wiersz {*} zmienia się jedynie to, że liczba pól stałych
zmniejsza się o 1.
Procedura może wyglądać następująco:
procedure Odwroc(n: Integer); var We: TextFile; Wy: file of Integer; Liczby: array of Integer; i: Integer; begin SetLength(Liczby,n); AssignFile(We,'LICZBY.TXT'); ReSet(We); for i:=0 to n-1 do ReadLn(We,Liczby[i]); CloseFile(We); AssignFile(Wy,'ODWR.INT'); ReWrite(Wy); for i:=n-1 downto 0 do Write(Wy,Liczby[i]); CloseFile(Wy); Liczby:=nil; end;
Użycie tablicy dynamicznej Liczby nie powinno być konieczne, ale to zrobiłem jakby ktoś był jednak tym zainteresowany. Chyba można przyjąć, że jest już zadeklarowana jakaś tablica o odpowiedniej wielkości. Reszta chyba nie wymaga wyjaśnień.
[ spis ]Strona 424/425.
[ spis ]
Strona 208.
Ale warto zaznaczyć, że stan-wyjątkowy to nie jest po prostu nazwa
stanu wyjątkowego, ale obiekt odpowiedniego typu lub konstruktor
tego obiektu (częściej używane) - patrz przykład 7.13 ze str.209.
Strona 77/78.
[ spis ]
Strona 123.
Ale wątpie, żeby to się pojawiło, bo teraz używa się typu klasowego (str.113),
co dhAM często i dobitnie zaznaczał.
Strona 164.
Wystarczy zapamiętać, że shl i shr działają wyłącznie na liczbach
całkowitych (przesuwają bity). Pozostałe działają na typie Boolean oraz
na typach całkowitych (po bitach jak na typie logicznym).
Odpowiedź na podobne pytanie, ale rozszerzone o parametry przekazywane przez stałe i różnice między nimi znajdziecie pod Zestaw III / zadanie 9
[ spis ]
Podobny przykład 12.2/2 ze strony 350.
Konstrukcja wyrażenie:długość:miejsca_dzies ma na celu sformatowanie liczby.
Gdy nie ma podanego parametru miejsca_dzies (albo jest ujemny) to
używany jest format zmiennoprzecinkowy (ten śmieszny z E). Wtedy długość oznacza
ile co najmniej miejsc ma zajmować cała liczba (dodawane są ewentualnie spacje
na początku). Ale ten format składa się koniecznie z minimum dziesięciu znaków
(- lub spacja cyfra.cyfry_dzies E znak 4_cyfry_wykł),
więc jeśli długość<=10 to jest ona po prostu ignorowana.
Gdy podane są miejsca_dzies to rezygnuje się z formatu z E i wypisuje
się liczbę tak jakbyśmy my ją napisali, ale do określonego miejsca po przecinku
(ewentualnie zaokrąglając). Jeśli chodzi o dłguość to będzie miała ona
takie samo znaczenie (ale teraz ma sens by była mniejsza niż 10).
Przykład 13.19 ze strony 441.
Funkcja Ord dla liczb całkowitych zwraca jej wartość (niezależnie czy jest
pełnego typu, czy okrojonego). Dla znaków, zwraca ich kod ASCII (też nieważne
czy pełny, czy okrojony). Jeśli chodzi o
typ Boolean to zwraca 1 dla TRUE i 0 dla FALSE. Natomiast dla
wartości typu wyliczeniowego zwraca jej liczbę porządkową, czyli numer w definicji
tegoż typu (licząc od 0).
Odpowiedź na podobne pytanie, ale rozszerzone o rodzaje metod znajdziecie pod Zestaw IV / zadanie 10
[ spis ]Odpowiedź na podobne pytanie, ale rozszerzone o dyrektywy języka znajdziecie pod Zestaw III / zadanie 2
[ spis ]Odpowiedź na podobne pytanie, ale rozszerzone o typy rzeczywiste znajdziecie pod Zestaw III / zadanie 3
[ spis ]Strona 151.
[ spis ]Odpowiedź na podobne pytanie, ale rozszerzone o parametry przekazywane przez wartość i różnice między nimi znajdziecie pod Zestaw III / zadanie 9
[ spis ]
Przykład 12.1/1 ze strony 344.
Oczywiście do zmiennej i wczytana jest wartość 1, a do r 2.
Po wczytaniu tych liczb "wskaźnik" pliku ustawia się na spacji po dwójce,
więc wcztanym znakiem do znak jest ' ' (gdybyśmy chcieli wczytać
liczbę to wskaźnik pliku przeskoczyłby spacje aż trafiłby na liczbę). Później
do lancuch zostanie wczytany 'matematyka'.
Podobny przykład 13.35 ze strony 455.
Myślę, że nie musicie się przejmować tym gadaniem o wyłączonym koprocesorze,
bo w OP jest to chyba niewykonalne.
Formatowanie liczby w procedurze Str polega na tym samym jak
przy Write (patrz: Zestaw VIII / zadanie 7),
tyle że wynik trafia do zmiennej łańcuchowej zamiast na ekran oraz
przetworzony łańcuch jest skracany (po prostu obcięty na końcu) do
długości tej zmiennej łańcuchowej.
Warto jeszcze zauważyć, że ostatnie 3 przykłady dałyby dokładnie ten sam wynik gdyby zmienne łańcuchowe były odpowiednio długie (ale nie są więc są w różnych miejscach obcięte). Tak jest dlatego, że miejsca_dzies nigdzie nie są podane (raz jest ujemne, co na jedno wychodzi), a długość jest <=10, czyli traktowana wtedy jak 10.
[ spis ]
Strona 413 oraz przykład 13.11/1 ze strony 414.
Lista jednokierunkowa i stos to właściwie to samo, ale z założenia w stosie
dostępny jest jedynie jego wierzchołek (nie przegląda się innych elementów
oraz można dodawać i usuwać wyłącznie z jego szczytu).
Strona 303.
Obiekt polimorficzny to obiekt, w którym metody pokrywają metody z obiektów
nadrzędnych (str.76).
Odpowiedź na podobne pytanie, ale rozszerzone o słowa kluczowe znajdziecie pod Zestaw III / zadanie 2
[ spis ]Strona 186/187.
[ spis ]
Przykład 12.10/1 (ten drugi program) ze strony 367.
Wszystko było by dobrze, gdyby nie to, że trzecia linijka nie zawiera 'o'
na początku, ale za to spację na końcu.
Pierwsza pętla wczytuje 28 znaków (zatrzymuje się na spacji, której nie wczyta).
Eoln zwraca FALSE, bo jesteśmy na spacji, a nie na końcu linii.
Linia Read(tekst,znak,znak,znak); wczytuje tą spację oraz 2 znaki CR i LF
(i ignoruje je). Następna pętla wczytuje 31 znaków. Mimo, że zatrzyma się na
spcaji, to funkcją SeekEoln przeskoczymy na znak końca linii (bo ta funkcja
dąży do końca linii omijając spacje i taby oraz zwraca TRUE jesli dojdzie).
Następna linia Read(tekst,znak,znak,znak); wczyta już znaki CR, LF
i pierwszy znak z następnej linii, które zignoruje. Następna pętla wczyta 37
znaków (ze spacją na końcu włącznie), które wypisze. Funkcja Eof
oczywiście zwaraca FALSE (bo nie jesteśmy na końcu pliku). Później funkcja
SeekEof, przechodzi do końca pliku (omijając spacje, taby i znaki końca
linii) i zwraca TRUE jeśli dojdzie (a w tym przypadku dojdzie).
Zadanie jest chyba przeterminowane.
[ spis ]
Podobny przykład 4.3/4 ze strony 98.
Typ q definiuje wartości całkowite z przedziału [-40;0].
Jeśli chodzi o typ p, to jego definicja jest błędna, ponieważ
przy definicji typu okrojonego pierwsze wyrażenie stałe nie może zaczynać
się od nawiasu (bo wtedy oczekiwana jest definicja typu wyliczeniowego).
program MinSingle; {$APPTYPE CONSOLE} var p,x: Single; begin p:=1; x:=p/2; while x<>0 do begin p:=x; x:=p/2; end; WriteLn('Najmniejsza wartosc dodatnia w typie Single: ',p); ReadLn; end.
Działa to dlatego, że liczby zapisane są w systemie dwójkowym, więc najmniejsza wartość w typie Single powinna być pewną ujemną potęgą dwójki.
[ spis ]
Pakiet jest to zbiór skompilowanych modułów. Ich zastosowanie polega
na tym, że można wymienić pewną część programu, zamiast całości.
Ogólna postać pakietu wygląda następująco:
package nazwa_pakietu; requires nazwy_innych_pakietów; contains lista_nazw_modułów; end.[ spis ]
Podstawowe (te niezależne od procesora i systemu operacyjnego):
ShortInt (8-bitowy ze znakiem), Byte (8-bitowy bez znaku),
SmallInt (16-bit. ze zn.), Word (16-bit. bez zn.),
LongInt (32-bit. ze zn.), LongWord (32-bit. bez zn.),
Int64 (64-bit. ze zn.).
Ogólne (zależne od procesora lub systemu operacyjnego):
Integer (aktualnie 32-bit. ze zn.),
Cardinal (aktualnie 32-bit. bez zn.).
Strona 127.
[ spis ]Linijki kodu:
a:=VarArrayCreate([0,3,1,5],varDouble);
[ spis ]
program MinDouble; {$APPTYPE CONSOLE} var p,x: Double; begin p:=1; x:=p/2; while x<>0 do begin p:=x; x:=p/2; end; WriteLn('Najmniejsza wartosc dodatnia w typie Double: ',p); ReadLn; end.
Działa to dlatego, że liczby zapisane są w systemie dwójkowym, więc najmniejsza wartość w typie Double powinna być pewną ujemną potęgą dwójki.
[ spis ]Właściwie to nie mam zielonego pojęcia. Można pewnie znaleźć coś na ten temat w suplemencie do ŻK (którego nie posiadam).
[ spis ]???????????????
[ spis ]
function f(n: Integer): Integer; var sum: Integer; i: Integer; begin if (n=1)or(n=2) then sum:=1 else try sum:=0; for i:=1 to n-1 do Inc(sum,f(i)); except on EIntOverflow do sum:=-1; end; f:=sum; end;
Na skutek wystąpienia warunku EIntOverflow moja funkcja zwróci wartość -1, czyli taką, której normalnie nigdy by nie osiągnęła (ale nie wiem czy o to chodziło dhAM). Można zamiast tego kazać wypisać jakiś komunikat o błędzie.
[ spis ]
program MinExtended; {$APPTYPE CONSOLE} var p,x: Extended; begin p:=1; x:=p/2; while x<>0 do begin p:=x; x:=p/2; end; WriteLn('Najmniejsza wartosc dodatnia w typie Extended: ',p); ReadLn; end.
Działa to dlatego, że liczby zapisane są w systemie dwójkowym, więc najmniejsza wartość w typie Extended powinna być pewną ujemną potęgą dwójki.
[ spis ]
W pierwszym przypadku mamy do czynienia z literałem zmiennym, czyli tak
jakby stałą określonego typu. Można jej jednak przypisywać nowe wartości,
choć nie jest to wskazane i wykonywalne jedynie przy dyrektywie kompilatora
$J+.
W drugim przypadku mamy do czynienia po prostu ze zmienną, która ma
zainicjalowaną wartość.
Łańcuchy zasobowe to są łańcuchy, które są jakby łańcuchami stałymi, ale pamiętane
są w zewnętrznym pliku, który można podmienić
(np. zmieniając wersję językową programu).
Deklaruje się je tak:
resourcestring identyfikator= wyrażenie_łańcuchowe_stałe;
Dalej w programie łańuch jest traktowany jak zadeklarowany przy użyciu klauzuli
const. Różnica jest taka, że przy kompilacji programu
łańcuch jest zapisywany do pliku .DRC i to właśnie zawartość tego pliku (a nie
ciąg znaków z definicji) decyduje o tym co jest widziane pod identyfikatorem
identyfikator.
Tak przynajmniej brzmi oficjalna wersja, bo ja nie zaobserwowałem faktu pojawienia
się pliku .DCR, natomiast łańuchy zasobowe, znalazły się wśród wielu zasobów
wewnątrz pliku .EXE.
Podstawowe (te niezależne od procesora i systemu operacyjnego):
Real48 (6 bajtowy), Single (4 bajty), Double (8 bajtów),
Extended (10 bajtów), Comp (8 bajtów), Currency (8 bajtów).
Przy czym te ostatnie dwa są stałoprzecinkowe.
Ogólne (zależne od procesora lub systemu operacyjnego):
tylko Real (aktualnie 8 bajtów).
Należy użyć tak zwanego przeciążania funkcji, czyli napisać dwie funkcje o identycznej nazwie i różnych parametrach. Zależnie parametrów aktualnych kompilator sam zadecyduje, którą funkcję wywołać.
function Suma(s1,s2,s3: Integer): Integer; overload; begin Suma:=s1+s2+s3; end; function Suma(s1,s2,s3: Real): Real; overload; begin Suma:=s1+s2+s3; end;[ spis ]
Sytuacja wygląda następująco. Zmienna r jest w rzeczywistości wskaźnikiem
na tablicę dynamiczną, która tak naprawdę jest tablicą wskaźników na kolejne
tablice dynamiczne elementów typu Extended.
Sama zmienna r zajmuje 4 bajty (bo to wskaźnik przecież).
Po wykonaniu pierwszej linijki zostanie pamięć zarezerwowana na 20 elementów, które
są też wskaźnikami (na kolejne tablice dynamiczne). Zajmują one 20*4=80 bajtów
pamięci.
Tablica r ma elementy od 0 do 19, więc Low(r)=0 i High(r)=19
zatem pętla for wykona się dla elementów i równych od 0 do 19.
Po jej wykonaniu zostanie zarezerwowana pamięć na tablice dynamiczne, które mają
kolejno 20, 19, ..., 2, 1 elementów (razem 210) typu Extended. Czyli zajmuje
210*10=2100 bajtów pamięci.
Teraz powstaje pytanie o co tak naprawdę chodziło dhAM?
Jeśli chodziło mu o to ile łącznie zajmują elementy typu Extended to odpowiedź
jest 2100. Jednak właściwie to tablica r jest tablicą wskaźników (co z tego,
że wskazują one na kolejne tablice dynamiczne), a wtedy odpowiedzią jest 80.
A może chodziło o całość pamięci zużytą przez wszystkie części tablicy - wtedy
należy odpowiedzieć 4+80+2100=2184.
Żeby zwolnić pamięć należałoby dla każdego elementu tablicy r, a później
dla samej tablicy r wykonać procedurę Finilize ze wskaźnikiem
podanym jako parametr.
for i:=Low(r) to High(r) do Finalize(r[i],0); Finalize(r,0);[ spis ]
Przykład 8.11 ze strony 253.
divcplx(z,s,z);