使用QB64函数SWAP的用户定义类型的问题

问题描述 投票:0回答:1

我试图使用QB64编译QB程序DIMORDIN.BAS(旧的QB4.5软件包中包含的示例。)>

编译不表示错误,但是程序的执行令人惊讶...大多数排序类型的执行都会导致分段错误。

调试代码,我发现导致此结果的原因是语言功能SWAP,证据表明,该功能无法交换复杂和/或用户定义的类型。这样的行:SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)给出分段错误。

您有解决方案吗?为什么QB64不符合QB4.5的此功能?

以下代码是出现分段错误的SUB的原始代码(不幸的是,我只有意大利语版本。

我无法在此处发布完整代码,因为它大于30,000个字符。

SUB OrdShell STATIC

    ' Imposta lo scarto per il confronto a met del numero di record in MatrOrd:
    Scarto = RigheMass \ 2

    PRINT
    DO WHILE Scarto > 0 ' Cicla finch Scarto non diventa zero.
        Limite = RigheMass - Scarto
        DO
            Scambi = FALSO ' Presume non vi siano stati scambi
            ' con questo valore di Scarto.

            ' Confronta elementi e scambia quelli non in ordine:
            FOR Riga = 1 TO Limite
                IF MatrOrd(Riga).Lung > MatrOrd(Riga + Scarto).Lung THEN
                    SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)
                    ScambiaBarre Riga, Riga + Scarto
                    Scambi = Riga
                END IF
            NEXT Riga

            ' Al passaggio successivo ordina solo fino al punto dell'ultimo
            ' scambio:
            Limite = Scambi - Scarto
        LOOP WHILE Scambi

        ' Nessuno scambio al precedente valore di scarto; lo dimezza:
        Scarto = Scarto \ 2
    LOOP
END SUB

为了帮助您理解SUB,我添加了程序的声明部分:

' Definisce il tipo di dati usato per contenere i dati delle barre:
TYPE TipoOrd
    Lung AS INTEGER ' Lunghezza della barra (l'elemento di
    ' confronto nei vari ordinamenti)
    ValColore AS INTEGER ' Colore della barra
    StringaBarra AS STRING * 43 ' La barra (una stringa di 43 caratteri)
END TYPE

' Dichiara le costanti globali:
CONST FALSO = 0, VERO = NOT FALSO, COLONNASIN = 49
CONST NUMOPZIONI = 11, NUMORDINAMENTI = 6

' Dichiara le variabili globali e alloca loro spazio nella memoria. MatrOrd
' e BackupOrd sono matrici del tipo di dati TipoOrd definito sopra:
DIM SHARED MatrOrd(1 TO 43) AS TipoOrd, BackupOrd(1 TO 43) AS TipoOrd
DIM SHARED LeggendaOpzioni(1 TO NUMOPZIONI) AS STRING * 14
DIM SHARED TempoIniz AS SINGLE
DIM SHARED PrimoPiano, Sfondo, Silenzio, Pausa
DIM SHARED Selezione, RigheMass, RigheIniz, ColoriMass

我正在尝试使用QB64编译QB程序DIMORDIN.BAS(旧QB4.5软件包中包含的示例)。编译不表示错误,但是程序的执行显示一个...

qb64
1个回答
0
投票

[一杯咖啡后,我解决了编写子程序SWAPT的问题,该子程序在用户定义的类型TipoOrd的变量之间执行交换。

© www.soinside.com 2019 - 2024. All rights reserved.