BasicC/Komendy
Predefiniowane typy i zmienne
[edytuj]W 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
[edytuj]Definicja: FILE*BASFILE=NULL;
Zmienna typu FILE* wykorzystywana przez komendy obsługi plików.
STRLEN
[edytuj]Definicja: #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
[edytuj]Definicja: 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$
[edytuj]Definicja: STRING STRING$;
Zmienna pomocnicza typu STRING używana przez niektóre komendy Basic.
VALUE
[edytuj]Definicja: double VALUE;
Zmienna pomocnicza typu double.
Dodatkowe definicje zawiera BasicSDL, jest to omówione w innej części.
Funkcje i procedury
[edytuj]Powinny być zdefiniowane lub najpierw zadeklarowane przed wywołaniem. Definiujemy jak w przykładach, deklarujemy jak w C, podobnie jak zmienne: typ nazwa(argumenty);. W przypadku procedury jako typ podajemy void, Sub lub Procedure, dla funkcji zamiast double możemy użyć Function lub ogólnie Func typ. Przy wywoływaniu funkcji czy procedury używamy nawiasów, jak w C, oraz średnika (gdy nie korzystamy z B2C).
MAIN
[edytuj]Począ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
[edytuj]Koniec głównej części programu. Odpowiednik } w C.
Function
[edytuj]Funkcja zwracająca wartość typu double. To samo co double w C.
Func
[edytuj]Funkcja zwracająca wartość 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 gdy nie korzystamy z B2C. Parametry (argumenty) należy podawać w nawiasie wraz z typem zmiennej, również gdy korzystamy z B2C.
Begin
[edytuj]Początek ciągu (bloku) instrukcji. To samo co { w C.
Def
[edytuj]Oznacza początek bloku komend (zwanych w C komendą złożoną) definicji funkcji. To samo co Begin i { w C.
Begin lub Def jest wymagane w definicjach funkcji/procedur gdy nie korzystamy z B2C.
EndFunc
[edytuj]Oznacza koniec bloku komend funkcji, czyli koniec definicji funkcji. To samo co } w C.
Return
[edytuj]Zakończenie definicji funkcji zwracające wartość 0. To samo co return 0;} w C. Może być stosowane zamiast return 0; EndFunc, jednak nie zaleca się jej używania, nie można tego robić z użyciem B2C. Do zwracania wartości używamy komendy return wartość; języka C, wartość może być pominięta - wtedy następuje wyjście z funkcji/procedury, a zwracana wartość nie będzie zdefiniowana.
Procedure lub Sub
[edytuj]Początek procedury (podprogramu), czyli "funkcji", która nic nie zwraca. To samo co void w C. W BasicC 2 nie trzeba używać nawiasów, jeśli procedura nie ma parametrów.
EndProc lub EndSub
[edytuj]Koniec definicji procedury. To samo co } w C.
Go(procedura)
[edytuj]Alternatywna komenda do wywoływania podprogramów bez parametrów, jak GOSUB w innych odmianach Basic'a. B2C nie wymaga nawiasów.
Przykład:
#include "Basic.h"
Function mnoz(float a, float b) Def
Prn(a) Prt(" * ") Prn(b) Prt(" = ")
return(a*b);
EndFunc
Func int dodaj(int a, int b)
Def
Prn(a) Prt(" + ") Prn(b) Prt(" = ")
return(a+b);
EndFunc
Procedure PISZ(int a, int b)
Begin
Prn (dodaj(mnoz(a,b),dodaj(a,b))) NL
EndProc
Sub ZAKONCZ()
Begin
Prt ("I Koniec!") NL
EndSub
MAIN
PISZ(2,2); Go(ZAKONCZ)
ENDMAIN
BasicC 2:
#include "Basic.h"
Function mnoz(float a, float b)
Print a; "*"; b; "=";
Return a*b
EndFunc
Func int dodaj(int a, int b)
Print a; "+"; b; "=";
return a+b
EndFunc
Procedure PISZ(int a, int b)
Print dodaj(mnoz(a,b),dodaj(a,b))
EndProc
Sub ZAKONCZ
Print "I Koniec!"
EndSub
MAIN
PISZ(2,2)
Go ZAKONCZ
ENDMAIN
Komendy sterujące, pętle
[edytuj]Break
[edytuj]Wyjście z pętli lub bloku. To samo co break; w C.
Cont
[edytuj]Przejście do kolejnej iteracji, na początek pętli. To samo co continue; w C.
Exit(a)
[edytuj]Wyjście z programu ze zwróceniem wartości a.
goto etykieta;
[edytuj]Jest to komenda C powodująca skok programu do miejsca oznaczonego jako etykieta:, która jest dowolną nazwa i musi być umieszczona w tej samej funkcji/procedurze co goto. Nie stosujemy nawiasów, piszemy małymi literami, w B2C nie potrzeba średnika i można stosować duże litery.
system(polecenie);
[edytuj]Komenda C, wywołuje polecenie systemowe przekazane jako argument. Praca programu zostaje wstrzymana aż do wykonania polecenia. Po zakończeniu wykonywania polecenia system operacyjny oddaje kontrolę programowi, zwracając liczbę całkowitą, która informuje czy wywołanie polecenia się powiodło. Może być użyta z argumentem NULL by sprawdzić czy interpreter poleceń istnieje.
Do ... Loop
[edytuj]Pę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
[edytuj]Podstawia 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. Pętle kończymy komendą Next bez podawania nazwy zmiennej. Zmienna musi być zadeklarowana.
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) ... Next
[edytuj]Pę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.
For I=P To K Step S ... Next
[edytuj]Składnia For stosowana w BasicC 2 (B2C). Step można pominąć.
Repeat ... Until(X)
[edytuj]Pętla wykonywana dopóki wyrażenie X stanie się prawdziwe, czyli odwrotnie niż while(X), co najmniej 1 raz. To samo co do{ ... }while(!(X)); w C.
While(X) ... Wend
[edytuj]Pętla wykonywana gdy X jest prawdziwe. To samo co while(X){ ... } w C.
Instrukcje warunkowe
[edytuj]If(X) ... Else ... ElseIf(Y) ... EndIf
[edytuj]Jeś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. Nie używa się THEN.
Select(X) ... Case Y: ... EndSelect
[edytuj]Wykonuje 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. Komendy do wykonania nie powinny się znajdować w tej samej linii co Case.
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 się 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)
Prn(2) NL
ElseIf (i==4)
Prn(4) NL
EndIf
Select(i)
Prt("default") NL
Case 5:
Prn(55) NL
Case 6:
Prn(66) NL
case 7:
Prn(77) NL
EndSelect
Next
ENDMAIN
BasicC 2:
#include "Basic.h"
MAIN
int i
For i=2 To 7
If i==2
Print 2
ElseIf i==4
Print 4
EndIf
Select i
Print "default"
Case 5:
Print 55
Case 6:
Print 66
case 7:
Print 77
EndSelect
Next
ENDMAIN