Każdy programik jaki zapewne napiszesz będzie wykorzystywał STRINGi, oto niektóre z poleceń, które mogą sie przydać przy pisaniu własnych programów:
wynik:=StrCmp(string1,string2,dlugosc=ALL)
To polecenie porównuje string1 ze string2, z możliwością porównania tylko
kilku znaków [jeśli podasz trzeci argument - długość]. Zwraca TRUE jeśli
takie same lub FALSE jeśli nie (małe i DUŻE literki są rozpoznawane!).
StrCopy(docelowy_estring,zrodlowy_string,dlugosc=ALL)
Kopiuje zrodlowy_string do docelowy_estring. Jeśli dlugosc=ALL to cały
STRING będzie skopiowany (jeśli wpiszesz np. 5 to tylko 5 znaków ze
zrodlowy_string zostanie skopiowane).
StrAdd(docelowy_estring,zrodlowy_string,dlugosc=ALL)
To samo co StrCopy, z tą różnicą, że STRING jest dodawany na końcu
docelowy_estring.
Najlepiej wytłumaczy to mały przykładzik:
PROC main() DEF s[30]:STRING StrCopy(s,'To jest pierwszy', ALL) WriteF('StrCopy: "s"n',s) StrAdd(s,' a to drugi ') WriteF('StrAdd: "s"n',s) ENDPROC
dlugosc:=StrLen(string)
Zwraca dlugosc stringu do napotkania 0 (końca estring'u).
dlugosc:=EStrLen(estring)
Zwraca dlugosc całkowitą estringu.
Aby lepiej zobaczyć różnicę między StrLen i EStrLen napisz taki programik:
PROC main() DEF tekst[256]:STRING,lalamido StringF(tekst,'Lalala'); lalamido:='ALA' WriteF('tekst - StrLen:d, EStrLen:dn',StrLen(tekst),EstrLen(tekst)) WriteF('TEkst:s-max:dnn',tekst,StrMax(tekst)) WriteF('lalamido: StrLen(d),EstrLen(d)nn',StrLen(lalamido),EstrLen(lalamido)) ENDPROC
max:=StrMax(string)
Zwraca maksymalną długość string-u.
StringF(estring,tekst,argumenty)
Polecenie zbliżone do WriteF, tylko z tym, że tekst "idzie" do estring-u.
Np. WriteF('Alicja ma lat d',25) -> StringF(tekst,'Alicja ma lat d',25)
Dzięki temu możesz dany tekst wykorzystać póżniej i możesz go "obrabiać".
RightStr(estring1,estring2,n)
Kopiuje tekst z estring2 do estring1 n-znaków, zaczynając od prawej strony!
MidStr(estring,string,pozycji,dlugosc=ALL)
Kopiuje string do estringu zaczynajac od pozycji do wymaganej dlugosc'i
(pamiętaj pozycja stringu zaczyna się od 0, a nie od 1 jak w Basicu).
UpperStr(string)
Zamienia wszystkie litery na litery WIELKIE.
LowerStr(string)
Zamienia wszystkie litery na litery MAŁE.
znaleziona_pozycja:=InStr(string1,string2,startpoz=0)
Szuka w string1 string2, jeśli nie znajdzie to zwraca -1, a jeśli znajdzie to
pozycje na znaleziony string2.
Pętle (FOR) stosuje się zazwyczaj, kiedy chcesz powtórzyć dane instrukcje
daną ilość razy, np. po co pisać 20 razy tekst Hello skoro możesz napisać
raz i przy użyciu FOR uzyskać tekst 20 razy. Tak więc instrukcja FOR ma postać:
FOR <zmienna> := <wyrazenie1> TO <wyrazenie2> STEP <kroki> DO <instrukcja>
lub
FOR <zmienna> := <wyrazenie1> TO <wyrazenie2> STEP <kroki>
<instrukcje>
ENDFOR
<Zmienna> deklarujesz jako typu LONG, <wyrazenie1> to jest jaką wartość na początku ma zawierać <zmienna>, a <wyrazenie2> jest to do jakiej wartości ma "rosnąć" <zmienna>, natomiast <kroki> określa o ile ma się zwiększać <zmienna>.
Polecenie STEP możesz ominąć (domyślnie jest "skocz co 1")
Czyli jeśli chcesz wypisać liczby od 1 do 100 na ekranie to możesz użyć do tego celu FOR:
PROC main() DEF a FOR a:=1 TO 100 WriteF('Liczba :dn',a) ENDFOR ENDPROC
Kiedy uruchomisz ten program w oknie shella pokażą ci się liczby od 1 do 100, tak jak chcieliśmy... Działa to przez użycie zmiennej lokalnej "a", która zawiera w sobie liczbę ukazującą się w shellu. Instrukcja FOR rozpoczyna pętle, ustawia początkową wartość zmiennej "a" na 1. Następnie linie pomiędzy FOR, a ENDFOR są wykonywane (dlatego na ekranie pokazują nam się liczby). Kiedy program napotka ENDFOR zwiększa wartość zmiennej "a" o 1 (domyślnie STEP jest równy 1). Następnie sprawdza czy zakres nie został przekroczony (czyli czy "a" nie jest większe od 100), jeśli zakres został przekroczony to pętla jest zakańczana i program wykonuje dalsze instrukcje, które znajdują się po ENDFOR. Jeśli zakres nie został przekroczony to pętla jest powtarzana (czyli wszystkie komendy pomiędzy FOR i ENDFOR są powtarzane).
IF <wyrazenie> THEN <instrukcja_1> ELSE <instrukcja_2>
lub
IF <wyrazenie>
<instrukcje>
ELSE
<instrukcje>
ENDIF
W instrukcji IF występuje również polecenie ELSE, dzięki któremu możemy dodać
co ma się dziać jeśli coś nie jest zgodne z wyrażeniem, czyli np. jeśli
IF x>3 THEN WriteF('OK!') ELSE WriteF('NO')
to ELSE w tym przypadku oznacza, że jeżeli x nie jest większe od 3 to wypisz 'NO'.
Jeśli chcesz natychmiast wyjść z programu możesz do tego użyć polecenia CleanUp(zwracana_wartosc=0), które zastępuje polecenie DOSu Exit(). PAMIĘTAJ NIGDY NIE UŻYWAJ POLECENIA Exit(). Polecenie CleanUp() zwraca zarezerwowaną pamięć (tylko tę pamięć do której zarezerwowania użyłeś funkcji z E), zamyka biblioteki, etc.
Zmienne można podzielić na zmienne lokalne i globalne. Zmienne globalne są to takie zmienne, które zostały zadeklarowane przed wszystkimi procedurami (PROC) i są rozpoznawane we wszystkich procedurach (nie możesz już deklarować ich jako lokalne!). Natomiast zmienne lokalne są to takie zmienne, które są deklarowane w danej procedurze (PROC) i są jedynie w niej rozpoznawane i pamiętane.
Jak już potrafimy coś napisać, to teraz trzeba wiedzieć co oznaczają błędy zwracane przez kompilator.
Pokazuje co znajduje się w danym module, np. "ShowModule emodules:asl", wyświetli:
ShowModule v1.10 (c) 1992 $#%! now showing: "emodules:asl.m" NOTE: don't use this output in your code, use the module instead. LIBRARY aslbase /* informal notation */ AllocFileRequest() /* -30 (1E) */ FreeFileRequest(A0) /* -36 (24) */ RequestFile(A0) /* -42 (2A) */ AllocAslRequest(D0,A0) /* -48 (30) */ FreeAslRequest(A0) /* -54 (36) */ AslRequest(A0,A1) /* -60 (3C) */ ENDLIBRARY
Pierwsze trzy linijki informują nas:
Następne linijki to:
LIBRARY - oznacza, że opisywana jest biblioteka (w przykładzie asl.library)
Kolejne linijki opisują jakie komendy występują w bibliotece
ENDLIBRARY - oznacza koniec opisu biblioteki
Dalszy opis instrukcji występujących w modułach znajdziesz w następnych częściach kursu.