2016-07-16 17 views
5

Vì vậy, tôi muốn viết các chức năng lớn hơn trong Commodore 64 BASIC. Cho đến nay, từ những gì tôi nhìn thấy từ các nguồn khác (chẳng hạn như các wiki khác nhau của C64, cũng như hướng dẫn sử dụng cho bản thân C64), các định nghĩa hàm chỉ có thể dài một dòng. Đó là để nói, tôi dường như không thể tìm thấy một cấu trúc tương tự trong BASIC để ngoặc/bất kỳ ngôn ngữ nào khác sử dụng để phân định khối mã.Chức năng nhiều dòng trong Commodore 64 BASIC

Có ai biết cách tôi viết các khối mã trong BASIC có nhiều hơn một dòng không?

Ví dụ về chức năng một dòng:

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

Nhưng tôi không thể làm điều gì đó như:

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 

Cảm ơn bạn đã dành thời gian!

Trả lời

6

Rất tiếc C64 BASIC không hỗ trợ các chức năng phức tạp hơn .

Tuy nhiên, nó hỗ trợ các chương trình con phức tạp hơn và đó là những gì bạn muốn trong trường hợp này.

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 

Đáng tiếc là qua các thông số vào và trở về giá trị ra khỏi chương trình con trong C64 BASIC không chính thức hóa cấu trúc, do đó bạn sẽ chỉ phải làm việc với các biến thông thường như trình bày ở trên.

+0

modbasic là một phần mở rộng cơ bản (nêm?) Cho phép bạn làm các chương trình con với các tham số và thậm chí đệ quy. Thử tìm kiếm trên web với: "modbasic" commodore – Core

+0

Bạn không cần phải đặt chương trình con trước gosub. Trong thực tế, khi mọi thứ đứng chương trình của bạn sẽ bị lỗi bởi vì nó sẽ thực thi 'return' trước khi nó đã thực thi' gosub'. – JeremyP

+0

Tôi đã nghĩ về nó nhiều hơn như là một phần của một tổng thể lớn hơn, nhưng bạn đúng rằng nó gây hiểu lầm và sẽ có một lỗi nếu chạy trong sự cô lập. Tôi đã renumbered nó và thêm một tuyên bố nhận xét (bình luận) để làm rõ hơn nó. – Feneric

1

Từ những gì tôi nhớ lại, bạn có thể thực hiện việc này hầu như sử dụng colan để có nhiều lệnh trên một dòng. Không phải là giải pháp thanh lịch nhất, nhưng sẽ cho phép bạn phá vỡ mọi thứ lên:

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 

trở thành

10 n=n+1: print n 

Lưu ý rằng bạn không thể vượt qua đối số, do đó bạn sẽ phải khai báo thứ và để cho chồng BASIC chăm sóc của nó cho bạn. Thông thường tôi sẽ cấu trúc các chương trình như vậy:

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 

Đã lâu rồi; từ bộ nhớ, ký tự% là khai báo một biến như một số nguyên, tương tự như $ khai báo nó như một chuỗi.

0

Bạn có thể sử dụng các biến hiện có và các lệnh toán học với DEF FN, ví dụ, nếu bạn muốn PRINT 0-10 đã bao gồm trong nybbles 4-bit, người ta có thể làm điều này:

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 

Tôi đã thử làm tổ nhưng nó trở nên quá khó hiểu. Trên thực tế, tôi chưa thấy nhiều danh sách sử dụng DEF FN. Có lẽ một số lập trình viên hipster nghệ sĩ hipster cao trán sử dụng chúng?

Các vấn đề liên quan