BasicC/Komendy
Predefiniowane typy i zmienne
edytujW przypadku zmiennych obowiązują zasady języka C. Zmienne muszą być najpierw zadeklarowane poprzez podanie kolejno: typu zmiennej, nazwy i średnika. Można zadeklarować na raz więcej zmiennych danego typu oddzielonych średnikiem, można przypisać im początkowe wartości, np: int a,b=10,c;
Najpopularniejsze typy zmiennych to: int - całkowita, float - zmiennoprzecinkowa, STRING - specjalny typ używany w BasicC będący łańcuchem znaków o długości maks. STRLEN używany do przechowywania tekstu.
Zmienne zadeklarowane poza funkcjami, np. na początku programu, posiadają zasięg globalny i są widoczne w każdym miejscu programu (chyba że zostaną przysłonięte przez zmienne lokalne o tych samych nazwach). Zmienne lokalne zadeklarowane w blokach programu, które w C zawarte są w nawiasach klamrowych { }, dostępne są tylko w danym bloku. Instrukcje BasicC tworzące pętle, funkcje / procedury czy instrukcje warunkowe, automatycznie tworzą bloki programu.
W BasicC predefiniowane są zmienne, stałe i typy opisane poniżej.
BASFILE
edytujDefinicja: FILE*BASFILE=NULL;
Zmienna typu FILE* wykorzystywana przez komendy obsługi plików.
STRLEN
edytujDefinicja: #define STRLEN 255
Stała domyślnie ustawiona na 255 oznaczająca maksymalną długość ciągów typu STRING bez znaku końca łańcucha '\0', w trybie rozszerzonym $ (patrz rozdział o napisach) długość tekstu nie powinna przekraczać STRLEN-1, co nie powinno się wydarzyć jeśli operujemy na łańcuchach za pomocą komend Basic. Wartość tą można zmienić np. poprzez wpisanie komendy #define STRLEN L
przed załączeniem biblioteki BasicC, w miejsce L wpisując nową wartość.
STRING
edytujDefinicja: typedef char STRING[STRLEN+1];
Typ zmiennej łańcuchowej o długości STRLEN (+1). Zalecane jest stosowanie tego typu dla zmiennych łańcuchowych.
Uwaga: nie mylić z klasami string i basic_string występującymi w C++.
STRING$
edytujDefinicja: STRING STRING$;
Zmienna pomocnicza typu STRING używana przez niektóre komendy Basic.
VALUE
edytujDefinicja: double VALUE;
Zmienna pomocnicza typu double.
Dodatkowe definicje zawiera BasicSDL, jest to omówione w innej części.
Funkcje i procedury
edytujMAIN
edytujPoczątek głównej funkcji (bloku komend) programu, która jest wywoływana na samym początku, czyli początek wykonywalnej części programu. Całość zapisujemy dużymi literami. Odpowiednik int main(int argc, char *argv[]){
w C.
ENDMAIN
edytujKoniec głównej części programu. Odpowiednik } w C.
Function
edytujOznacza definicję funkcji zwracającej wartość typu double. To samo co double w C.
Func
edytujOznacza definicję funkcji zwracającej wartość dowolnego typu, który podajemy po Func. Komenda służy jedynie oznaczeniu definicji funkcji i z punktu widzenia C nic nie oznacza, jest usuwana w fazie pre-kompilacji, nie ma konieczności jej używania.
Begin
edytujPoczątek ciągu (bloku) instrukcji. To samo co { w C.
Def
edytujOznacza początek bloku komend (zwanych w C komendą złożoną) funkcji. To samo co Begin i { w C.
EndFunc
edytujOznacza koniec bloku komend funkcji, czyli koniec definicji funkcji. To samo co } w C.
Return
edytujWyjście z funkcji i zwrócenie wartości 0. Nie stosujemy na końcu średnika. To samo co return 0;
w C.
Procedure lub Sub
edytujDefinicja procedury (podprogramu), czyli "funkcji", która nic nie zwraca. To samo co void w C.
EndProc lub EndSub
edytujKoniec definicji procedury. To samo co } w C.
Przy wywoływaniu funkcji czy procedury używamy nawiasów i średnika jak w C.
Przykład:
#include "Basic.h"
Function mnoz(float a, float b) Def
Print a $ "*" _ b $ "=" );
return(a*b);
EndFunc
Func int dodaj(int a, int b)
Def
Print a $ "+" _ b $ "=" );
return(a+b);
EndFunc
Procedure PISZ(int a, int b)
Begin
Print dodaj(mnoz(a,b),dodaj(a,b)) NL
EndProc
Sub ZAKONCZ()
Begin
Print$ "I Koniec!" NL
EndSub
MAIN
PISZ(2,2); ZAKONCZ();
ENDMAIN
Pętle
edytujBreak
edytujWyjście z pętli lub bloku. To samo co break;
w C.
Cont
edytujPrzejście do kolejnej iteracji, na początek pętli. To samo co continue;
w C.
Do ... Loop
edytujPętla wykonuje kod zawarty pomiędzy Do i Loop w nieskończoność. To samo co do{ ... }while(1);
w C.
Gdy używamy BasicSDL w pętli odczytywane są zdarzenia i kończy się gdy Quit != 0: do{ ... GetSDLEvents();}while(!Quit);
For(I,P,K) ... Next
edytujPodstawia do zmiennej I początkową wartość P i w każdym przebiegu pętli zwiększa ją o 1. Pętla wykonuje się do momentu, gdy I osiągnie wartość K, czyli K-P+1 razy. To samo co for(I=P;I<=K;++I){ ... }
w C lub For I=P to K ... Next I
w typowym języku Basic.
Jeśli wymagane są bardziej skomplikowane operacje na zmiennych należy stosować składnie C.
Tu mała uwaga do informacji zawartej w podręczniku C. Zaleca się tam stosowanie formy "++I" przy inkrementacji zmiennej zamiast "I++", ma to powodować szybsze działanie programu. Testy tego nie potwierdzają, nie widać istotnych różnic w szybkości działania pętli For.
ForS(I,P,K,S)
edytujPętla For z dodatkowym parametrem S oznaczającym o ile będzie zmieniała się wartość I w każdym przebiegu pętli. Krok S może być ujemny. To samo co for(I=P;S<0?I>=K:I<=K;I+=S){ ... }
w C lub For I=P to K Step S ... Next I
w typowym języku Basic.
Repeat ... Until(X)
edytujPętla wykonywana dopóki wyrażenie X stanie się prawdziwe, czyli odwrotnie niż while(X), conajmniej 1 raz. To samo co do{ ... }while(!(X));
w C.
While(X) ... Wend
edytujPętla wykonywana gdy X jest prawdziwe. To samo co while(X){ ... }
w C.
Instrukcje warunkowe
edytujIf(X) ... Else ... ElseIf(Y) ... EndIf
edytujJeśli warunek X jest prawdą wykonuj ... w przeciwnym razie wykonuj ... w przeciwnym razie, jeśli Y wykonuj ... . Komendy Else i ElseIf nie są wymagane i mogą byś stosowane w różnej kolejności i ilości. To samo co if(X){ ... }else{ ... }else if(Y){ ... }
w C.
Select(X) ... Case Y: ... EndSelect
edytujWykonuje komendy po Case Y: gdy zmienna X ma wartość Y. Sekcji typu Case Y: ... jest więcej, dla różnych wartości X. Przed Case automatycznie dodawana jest komenda Break, dzięki czemu wykonywana jest tylko 1 sekcja. Jeśli chcemy, by była wykonywana kolejna - zamiast Case należy użyć case. Zaraz po Select(X) można wstawić kod, który wykonywany jest, jeśli X nie przyjmuje żadnej z wartości po Case. To samo co switch(X){default: ... break;case Y: ...}
w C.
Jest różnica w działaniu Select..Case i If/ElseIf. Break wywołany w sekcji Case powoduje wyjście tylko z sekcji Select, a wywołany w If powoduje wyjście z pętli, w której znajduje sie If. W Poniższym przykładzie pętla For wykonuje się do końca, choć w sekcjach Case niejawnie wywoływane jest Break, gdy Break dodamy w If - pętla For zostanie przerwana.
Przykład:
#include "Basic.h"
MAIN
int i;
For(i,2,7)
If (i==2)
Print 2 NL
ElseIf (i==4)
Print 4 NL
EndIf
Select(i)
Print$ "To znowu ja" NL
Case 5:
Print 55 NL
Case 6:
Print 66 NL
case 7:
Print 77 NL
EndSelect
Next
ENDMAIN