Ten kod ma nieprawidłową budowę – to nie jest moduł, żeby sekcja implementation
miała rację bytu. Nawet gdyby to był kod modułu, to brakuje sekcji interface
, a z kolei sam główny blok nie powinien w nim istnieć.
Po drugie, funkcja szukajmaxmin
zadeklarowana jest dwa razy, więc to też jest błąd. Podanie nagłówka funkcji robi się tylko w modułach, gdzie w sekcji interface
zapisuje się sam nagłówek, a w sekcji implementation
definicję funkcji (jej kompletne ciało). Wystawienie nagłówka funkcji w sekcji interface
powoduje, że funkcja ta będzie dostępna z poziomu innych modułów, a brak nagłówka oznacza, że funkcja będzie lokalna. Tak więc ten samotny nagłówek należy usunąć.
Błędów i niedociągnięć jest o wiele więcej, ale nie o tym mowa, więc dalej nie będę ich wymieniał.
Ja nie rozumiem co oznacza że typMM to albo sMin, który równa się jeden, albo sMax, który równa się 2. Co to oznacza?
To czego nie rozumiesz to deklaracja typu wyliczeniowego – tzw. enum. Tłumacząc w dość luźny sposób, taki typ pozwala na zgrupowanie kilku wartości liczbowych, gdzie każda posiada swoją nazwę – tu wartość 1
ma nazwę sMin
, a wartość 2
ma nazwę sMax
. Dzięki temu w kodzie możemy używać wygodnych nazw, zamiast niewiele mówiących gołych liczb.
Ustalenie wartości liczbowych nie jest konieczne, bo domyślnie nadawane są od 0
wzwyż:
Kopiuj
type
typMM = (sMin, sMax);
W takim przypadku sMin
będzie miało wartość 0
, a sMax
wartość 1
.
Przy czym należy pamiętać, że enumy – choć wewnętrznie są zwykłymi liczbami – nie mogą być jawnie użyte np. do operacji matematycznych, ani też nie da się ich bezpośrednio przypisać do zwykłej zmiennej liczbowej, wszystko przez silne typowanie języka. Aby przekształcić np. sMax
na liczbę 1
, należy skorzystać z funkcji Ord
lub użyć rzutowania na konkretny typ całkowitoliczbowy.
Nie wystarczyło napisać typMM=(sMin,sMax) ?
Wystarczyło, dlatego że te enumy nigdzie nie są traktowane jako liczby – nie są używane do obliczeń ani przypisań, więc ich wartości mogą być dowolne (najlepiej: domyślne). Prowadzący może o tym nie wiedział.
Co oznacza ta sekcja "try" na początku programu głównego, która zresztą mi nie działa?
Sekcja try
to konstrukcja języka, nie konkretna instrukcja – podobnie jak begin
i end
.
Wszystkie instrukcje znajdujące się pod try
są wykonywane w sposób standardowy, linijka po linijce. Jeśli któraś instrukcja spowoduje błąd, a tym samym rzucenie wyjątku, wykonanie instrukcji z tej sekcji zostaje przerwane i następuje skok do pierwszej instrukcji pod except
. Taka konstrukcja pozwala rozróżnić typ zaistniałego błędu (o którym informacje dostarcza obiekt owego wyjątku) oraz odpowiednio na niego zareagować. Co ważne – instrukcje znajdujące się pod except
zostaną wykonane tylko i wyłącznie wtedy, gdy instrukcje zawarte pod try
spowodują błąd. W przeciwnym razie kod pod except
zostanie pominięty.
Drugą konstrukcją try
jest try finally end
. Ta z kolei pozwala wykonać instrukcje zawarte pod finally
zawsze, bez względu na to czy instrukcje pod try
spowodowały błąd czy nie. Dzięki temu można np. zwolnić pamięć po wykonaniu konkretnych instrukcji i mieć pewność, że faktycznie zostanie ona zwolniona.
Możliwe też jest połączenie tych dwóch konstrukcji – dzięki temu po pierwsze możliwe jest zareagowanie na zaistaniały błąd, a po drugie, zabezpieczenie kodu np. przed wyciekami pamięci. Szablon niżej, w komentarzach opis sekcji:
Kopiuj
try
try
except
end;
finally
end;