qbasic как передать массив и переменные в функцию/подпрограмму?

Как я могу передать массив колоды (52) из ​​функции Newgame в функцию DeckShuffle

FUNCTION newgame
   'New game
   RANDOMIZE TIMER
   CALL cardsuit
   'heart$ = CHR$(3): diamond$ = CHR$(4): club$ = CHR$(5): spade$ = CHR$(6)
   quitgame = 0
   DIM playercards(maxhand), dealercards(maxhand), deck(52)
END FUNCTION
FUNCTION deckshuffle
   'first card
   CALL carddeck(deck(1))
   deck(1) = INT(RND * 52)
   deckindex = 2
   DO
      DO
         cardok = 1
         newcard = INT(RND * 52)
         FOR j = 1 TO (deckindex - 1) STEP 1
            IF newcard = deck(j) THEN
               cardok = 0
               EXIT FOR
            END IF
         NEXT j
      LOOP UNTIL cardok = 1
      deck(deckindex) = newcard
      deckindex = deckindex + 1
   LOOP UNTIL deckindex > 52
   deckindex = 1
   PRINT "* * * DECK SHUFFLED * * *"
END FUNCTION

в настоящее время я получаю сообщение об ошибке «Массив не определен» при попытке выполнить программу.


person user1475117    schedule 04.12.2019    source источник


Ответы (4)


Вы передаете массив в SUB или FUNCTION, добавляя круглые скобки к аргументу подпрограммы/функции при ее вызове, как в deck() ниже:

    DIM playercards(maxhand), dealercards(maxhand), deck(52)
    CALL deckshuffle(deck())
END FUNCTION

SUB deckshuffle (deck())
    ...

Я не совсем уверен, что должен отображать PRINT deckshuffle(deck()), поэтому я достаточно уверен, что вы хотели сделать deckshuffle и newgame сабвуферы, а не функции. В конце концов, функция предназначена для возврата значений. Вы должны использовать подпрограмму, если нет возвращаемого значения.

Кроме того, ваши функции не имеют определенных аргументов, поэтому вы, вероятно, получаете сообщение об ошибке:

FUNCTION newgame
    ' This is a function with 0 arguments.
    ...
END FUNCTION

SUB deckshuffle (deck())
    ' This is a subroutine with 1 argument:
    '    - an array of numbers named "deck"
    ...
END SUB

FUNCTION myATN (x)
    ' This is a function with 1 argument:
    '    - a number named "x"
    myATN = ATN(x)
END FUNCTION

Вы также можете использовать DIM SHARED в своей основной программе (вне любых подпрограмм/функций), и вам больше не нужно беспокоиться о параметрах подпрограмм/функций:

DIM SHARED playercards(maxhand), dealercards(maxhand), deck(52)
...
CALL newgame

SUB newgame
    ...
END SUB

SUB deckshuffle
    ...
END SUB
person MemReflect    schedule 05.12.2019
comment
Я изменил их на подпрограммы SUB, но теперь я получаю ошибку несоответствия параметров, когда пытаюсь запустить SUB Deckshuffle. - person user1475117; 06.12.2019

Вот подпрограмма для рандомизации колоды карт:

' init deck
DIM deck(1 TO 54)
' store deck
FOR L = 1 TO 54
    deck(L) = L
NEXT
' randomize deck
FOR L = 1 TO 20
    X = INT(RND * 54 + 1)
    Y = INT(RND * 54 + 1)
    SWAP deck(X), deck(Y)
NEXT
' spades/hearts/diamonds/clubs
FOR L = 1 TO 54
    X = deck(L)
    SELECT CASE X
        CASE 1 TO 13
            M = X
            S$ = "spades"
        CASE 14 TO 26
            M = X - 13
            S$ = "hearts"
        CASE 27 TO 39
            M = X - 26
            S$ = "diamonds"
        CASE 40 TO 52
            M = X - 39
            S$ = "clubs"
        CASE 53, 54
            PRINT "Joker"
            M = 0
    END SELECT
    SELECT CASE M
        CASE 1 ' ace
            PRINT "Ace of "; S$
        CASE 2 TO 10 ' 2-10
            PRINT M; " of "; S$
        CASE 11 ' jack
            PRINT "Jack of "; S$
        CASE 12 ' queen
            PRINT "Queen of "; S$
        CASE 13 ' king
            PRINT "King of "; S$
    END SELECT
NEXT
END
person eoredson    schedule 07.12.2019

Вот пример программы перетасовки колоды с использованием функции массива:

DIM deck(1 TO 54)
CONST ShuffleTimes = 10
FOR L = 1 TO 54
    deck(L) = L
NEXT
CALL shuffle(deck())
FOR L = 1 TO 54
    PRINT deck(L);
NEXT
END
SUB shuffle (deck())
    FOR L = 1 TO ShuffleTimes
        X = INT(RND * 54 + 1)
        Y = INT(RND * 54 + 1)
        SWAP deck(X), deck(Y)
    NEXT
END SUB
person eoredson    schedule 07.12.2019

Вы можете передать массив в качестве аргумента, выполнить некоторые вычисления, и значения отразятся в вызывающей программе.

'main program

DIM arr(1 TO 10)

'initialize array
temp = test(arr())

'print the array
FOR i = 1 TO UBOUND(arr)
    PRINT i
NEXT
END

'the function takes array as argument, then initializes 1 to 10
FUNCTION test (temp())
    FOR i = 1 TO UBOUND(temp)
        temp(i) = i   'set the array with the value of i
    NEXT i
    test = 0 'returning 0 
END FUNCTION
person Nava Bogatee    schedule 23.07.2021