Aktualności Forum Graffiti Publicystyka Teleport
  • Kurs języka E - część 3

20.02.2005 13:32, autor artykułu: Wojciech Zatorski (Amiga Computer Studio)
odsłon: 2580, powiększ obrazki, wersja do wydruku,

STRING rulez...

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 i pętelki

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).

Sprawdzania ciąg dalszy (IF)

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'.

Ja nie chcę do końca (CleanUp)

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 raz jeszcze...

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.

Błędy rulezzz

Jak już potrafimy coś napisać, to teraz trzeba wiedzieć co oznaczają błędy zwracane przez kompilator.

  • 'syntax error' - ten błąd to normalka. Występuje zawsze jeśli popełnisz podstawowe błędy typu np. napiszesz WriteF('ela'4) (a powinno być WriteF('ela',4))
  • 'unknown keyword/const' - użyłeś czegoś czego nie zdefiniowałeś, ten błąd występuje przeważnie, jak zadeklarowałeś np. stałą ALA, a piszesz ELA lub jeśli w ogóle nie zadeklarowałeś stałej, a używasz jej
  • '":=" expected' - występuje np. gdy w pętli FOR, <wyrazenie1> nie zawiera dwukropka.
  • 'unexpected characters in line' - użyłeś czegoś co nie powinno się znależć w danej linii
  • 'label expected' - użyłes skoku do etykiety, której nie ma (JUMP koniec, a końca nie ma)
  • '"," expected' - w instrukcji jest wymagany przynajmniej jeszcze jeden argument
  • 'variable expected' - instrukcja wymaga użycia <zmiennej> (np. FOR <zmienna>)
  • 'value does not fit in 32 bit' - wartość zmiennej przekracza zakres (np. a:=$FFFFFFFFF)
  • 'missing apostrophe/quote' - zapomniałeś dodać "'" np. w tekście (typu: StringF(ala,'tbee))
  • 'illegal command-line option' - użyłeś parameteru -opt w niepoprawnej formie (np. "EC -opt dh1:ble.e")
  • 'double declaration of label' - dwa razy użyłeś tej samej etykiety
  • 'no args' - użyłeś kompilatora EC, ale nie podałeś żadnych argumentów kompilatorowi
  • 'unmatched parentheses' - użyłes za dużo razy "(" niż ")"
  • 'double declaration' - podwójnie zadeklarowałeś zmienną
  • 'unknown identifier' - użyłeś zmiennej, którą nie zadeklarowałeś
  • 'unknown e/library function' - użyłeś nieznanej funkcji, powodem pojawienia się tego błędu może być błędne napisanie komendy/polecenia (np. writeF)
  • 'could not read module correctly' - nie mogę wgrać modułu, błąd pojawia się kiedy moduł nie istnieje (lub popełniłeś bład w zapisie nazwy modułu - MODULE 'ble', a napisałeś - MODULE 'bla')

ShowModule {nazwa modułu}

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:

  • o wersji programu ShowModule
  • o tym który moduł jest pokazywany ("emodules:asl.m")
  • o notce, że należy używać modułów, a nie tekstu wygenerowanego przez program ShowModule

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.

 głosów: 1   
dodaj komentarz
Na stronie SCENA.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem