Qbasic - пытается вызвать подпрограмму, но я получаю сообщение «Ожидаемый CALL, subname, (...)» - PullRequest
0 голосов
/ 24 августа 2018

Вот код, он берет 5 имен и алфавитирует их.У меня есть подпрограмма, которая сортирует имена, но, видимо, я не называю ее правильным способом.

DIM i AS INTEGER
DIM q AS INTEGER
DIM a AS STRING
DIM n(5) AS STRING
DIM z AS INTEGER
DIM x AS INTEGER
DIM y AS INTEGER
DIM g AS INTEGER

start:
CLS

FOR i = 1 TO 5
    INPUT "Name:", n(i) 'receiving 5 names
NEXT i

call Sort()                                **This is the line with the error**

PRINT "Names in Alphabetical Order:"
FOR i = 1 TO 5
    PRINT n(i)
NEXT i
INPUT "Again(y, n)", a
IF LCASE$(a) = "y" THEN GOTO start
IF LCASE$(a) <> "y" THEN STOP

'end of main program

SUB Sort (`enter code here`)
    FOR i = 1 TO 5
        FOR q = 1 TO 4
        IF LCASE$(n(q)) > LCASE$(n(q + 1)) THEN SWAP n(q), n(q + 1)
        IF LCASE$(n(q)) = LCASE$(n(q + 1)) THEN

            z = LEN(n(q))
            x = LEN(n(q + 1))
            IF z > x THEN g = x
            IF z < x THEN g = z

            IF z > 1 AND x > 1 THEN
                FOR y = 2 TO g
                    IF LCASE$(MID$(n(q), y, 1)) > LCASE$(MID$(n(q + 1), y, 1)) THEN
                        SWAP n(q), n(q + 1)
                        END
                    END IF
                    IF y = g THEN SWAP n(q), n(q + 1)
                NEXT y
            END IF
        END IF
    NEXT q
NEXT i

END SUB

Я попытался поместить параметр в подпрограмму "SUB Sort (n ())",массив, в котором есть имена, но там указан неправильный тип массива.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вот простой способ передать массив в подпрограмму сортировки в qb64:

DIM n(5) AS STRING
n(1) = "zachary smith"
n(2) = "xerox johnson"
n(3) = "yackle jones"
n(4) = "arnold aglet"
n(5) = "beth anderson"
CALL Sort(n())
FOR i = 1 TO 5: PRINT n(i): NEXT
END
SUB Sort (n() AS STRING)
FOR i = 1 TO 5
    FOR j = i + 1 TO 5
        IF n(i) > n(j) THEN SWAP n(i), n(j)
    NEXT
NEXT
END SUB

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

DIM SHARED n(5) AS STRING
n(1) = "zachary smith"
n(2) = "xerox johnson"
n(3) = "yackle jones"
n(4) = "arnold aglet"
n(5) = "beth anderson"
CALL Sort
FOR i = 1 TO 5: PRINT n(i): NEXT
END
SUB Sort
FOR i = 1 TO 5
    FOR j = i + 1 TO 5
        IF n(i) > n(j) THEN SWAP n(i), n(j)
    NEXT
NEXT
END SUB
0 голосов
/ 26 августа 2018

Ваша проблема в том, что вы набрали SORT(), когда нет аргументов.

Вызов SUB или FUNCTION с правильным синтаксисом поначалу может показаться немного странным в QB, а синтаксис для ключевого слова CALL делает вещи еще более запутанными:

' No arguments means you MUST NOT include the () afterward.
CALL SubNameE

' One non-array argument: n
CALL SubNameX(n)

' Two non-array arguments: a, b
CALL SubNameY(a, b)

' An array argument and a non-array argument: arr(), v
CALL SubNameZ(arr(), v)

Обратите внимание, как массивы передаются процедурам SUB и FUNCTION с использованием name(). Интерпретатор, вероятно, запутывается, когда вы пишете call SORT(), поскольку SORT() - это синтаксис для массива, а не вызов SUB / FUNCTION без аргументов.

Вы также можете написать приведенные выше строки кода без ключевого слова CALL, если это поможет вам:

' No arguments means only the procedure name is listed.
SubNameE

' One non-array argument: n
SubNameX n

' Two non-array arguments: a, b
SubNameY a, b

' An array argument and a non-array argument: arr(), v
SubNameZ arr(), v

Обратите внимание, что для SUB или FUNCTION для принятия аргумента массива они должны быть объявлены следующим образом:

SUB SORT (n() AS STRING)
' or if you wanted to use a type suffix
SUB SORT (n$())
...