【问题标题】:qbasic how to pass array and variables to a function/subroutine?qbasic 如何将数组和变量传递给函数/子程序?
【发布时间】:2020-03-29 15:49:39
【问题描述】:

如何将 Deck(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

目前我在尝试执行程序时收到“未定义数组”错误。

【问题讨论】:

    标签: arrays function subroutine qbasic freebasic


    【解决方案1】:

    通过在调用子/函数参数时添加括号将数组传递给SUBFUNCTION,如下面的deck()

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

    我不完全确定 PRINT deckshuffle(deck()) 应该显示什么,所以我有理由确定您的意思是制作 deckshufflenewgame 潜艇,而不是函数。毕竟,函数是用来返回值的。如果没有返回值,你应该使用 sub。

    此外,您的函数没有定义参数,这就是您可能会收到错误的原因:

    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
    

    【讨论】:

    • 我将它们更改为 SUB 例程,但现在当我尝试运行 deckshuffle SUB 时出现参数不匹配错误。
    【解决方案2】:

    这是一个使用数组函数的示例牌组洗牌程序:

    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
    

    【讨论】:

      【解决方案3】:

      这是一个随机化一副​​纸牌的子程序:

      ' 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
      

      【讨论】:

        【解决方案4】:

        您可以将数组作为参数传递,进行一些计算并将值反映在调用程序中

        '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
        

        【讨论】:

          猜你喜欢
          • 2020-07-28
          • 1970-01-01
          • 1970-01-01
          • 2014-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          相关资源
          最近更新 更多