2016-07-16 13 views
5

Tak więc, chciałbym napisać większe funkcje w Commodore 64 BASIC. Jak dotąd, z tego, co widzę z innych źródeł (takich jak różne wiki na C64, a także instrukcja dla samego C64), definicje funkcji mogą mieć tylko jedną linię. Oznacza to, że nie mogę znaleźć analogicznej konstrukcji w języku BASIC do nawiasów/cokolwiek innego używają inne języki do wyznaczania bloków kodu.Funkcje wieloliniowe w Commodore 64 BASIC

Czy ktoś wie, jak napisać bloki kodu w języku BASIC, które są więcej niż jedną linią?

Przykład funkcji jednej linii:

10 def fn X(n) = n + 1 
20 print fn X(5) rem Correctly called function. This will output 6 

Ale nie mogę zrobić coś takiego:

10 def fn X(n) = 
20 n = n + 1 
30 print n 
40 rem I'd like the definition of function X to end at line 30 above 
50 fn X(5) rem Produces syntax error on line 40 

Dziękuję za poświęcony czas!

Odpowiedz

6

Niestety C64 BASIC nie obsługuje bardziej skomplikowanych funkcji .

Obsługuje jednak bardziej skomplikowane podprogramy i tego właśnie potrzebujesz w tym przypadku.

10 rem you can set up n in advance here 
20 n = 23 
30 gosub 50 
40 rem n is now 24 
50 rem start of subroutine; this line is not needed, it's just here for clarity 
60 n=n+1 
70 print n 
80 return 
90 rem now you can call the subroutine on line 50 and it'll return at line 80 

Niestety przekazywania parametrów do wartości i powrót z podprogramów w C64 podstawowego nie są sformalizowane konstrukcje, więc po prostu trzeba pracować ze zmiennymi zwykłych, jak pokazano powyżej.

+0

modbasic to podstawowe rozszerzenie (wedge?), Które pozwala na wykonywanie podprogramów z parametrami, a nawet rekurencją. Spróbuj wyszukać w Internecie: "modbasic" commodore – Core

+0

Nie musisz wstawiać podprogramu przed gosubem. W rzeczywistości, jak rzeczy stoją twój program będzie błąd, ponieważ wykona 'return' przed wykonaniem' gosub'. – JeremyP

+0

Myślałem o tym bardziej jako część większej całości, ale masz rację, że wprowadza w błąd i dostałby błąd, gdyby działał w izolacji. Nadpisałem numer i dodałem kolejną uwagę (komentarz), aby lepiej to wyjaśnić. – Feneric

1

Z tego co pamiętam, można to zrobić wirtualnie za pomocą colanu, aby mieć wiele poleceń w jednym wierszu. Nie jest to najbardziej eleganckie rozwiązanie, ale pozwoli Ci złamać rzeczy:

10 def fn X(n) = 
20 n = n + 1 
30 print n 
40 rem I'd like the definition of function X to end at line 30 above 
50 fn X(5) rem Produces syntax error on line 40 

Staje

10 n=n+1: print n 

Należy pamiętać, że nie można przekazać argumentów, więc trzeba by zadeklarować rzeczy i niech BASIC stos dbać z tego dla ciebie. Zwykle tworzyłem programy takie jak:

1  rem lines 1-99 are definitions. 
2  n% = 0 : rem this declares the variable n as an integer, initializing it to 0 
100 rem lines 100-59999 are the core code 
101 n%=5 : gosub 60100 
59999 end : rem explicit end of the program to ensure we don't run into our subroutine block 
60000 rem lines 60000+ are my subroutines.. 
60100 n% = n% + 1 : print n% : return 

Minęło trochę czasu; z pamięci znak% deklaruje zmienną jako liczbę całkowitą, podobnie jak deklaruje ją $ ​​jako ciąg znaków.

0

Można wykorzystać istniejące zmienne i polecenia z DEF FN matematycznych, na przykład, jeśli chcesz PRINT 0 do 10 włącznie w 4-bitowych nybbles, można było to zrobić:

0 DEF FN B(X)=SGN(X AND B) 
1 FOR I=0 TO 10: REM OUR COUNTER 
2 B=8: REM OUR BIT MARKER (128, 64, 32, 16, 8, 4, 2, 1) 
3 FOR J=0 TO 3: REM WE WANT 4-BIT NYBBLES, SO 0 TO 3 INCLUSIVE 
4 PRINT RIGHT$(STR$(FN B(I)),1);: REM CALLS OUR FUNCTION 
5 B=B/2: REM MOVES TO NEXT BIT MARKER 
6 NEXT J: REM PROCESS FOR LOOP J 
7 PRINT: NEXT I: REM NEW LINE THEN PROCESS FOR LOOP I 

Próbowałem gniazdowania funkcje, ale staje się zbyt mylące. W rzeczywistości nie widziałem wielu aukcji, które używają DEF FN. Może niektórzy programiści z BASIC, którzy używają BASIC, używają ich?