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.

Definicja: double VALUE;
Zmienna pomocnicza typu double.

Dodatkowe definicje zawiera BasicSDL, jest to omówione w innej części.

Funkcje i procedury

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

Oznacza definicję funkcji zwracającej wartość typu double. To samo co double w C.

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

Początek ciągu (bloku) instrukcji. To samo co { w C.

Oznacza początek bloku komend (zwanych w C komendą złożoną) funkcji. To samo co Begin i { w C.

EndFunc

edytuj

Oznacza koniec bloku komend funkcji, czyli koniec definicji funkcji. To samo co } w C.

Return

edytuj

Wyjś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

edytuj

Definicja procedury (podprogramu), czyli "funkcji", która nic nie zwraca. To samo co void w C.

EndProc lub EndSub

edytuj

Koniec 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

edytuj

Wyjście z pętli lub bloku. To samo co break; w C.

Przejście do kolejnej iteracji, na początek pętli. To samo co continue; w C.

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

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 lub For I=P to K Step S ... Next I w typowym języku Basic.

Repeat ... Until(X)

edytuj

Pę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

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.

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.

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