我试图使用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软件包中包含的示例)。编译不表示错误,但是程序的执行显示一个...
[一杯咖啡后,我解决了编写子程序SWAPT
的问题,该子程序在用户定义的类型TipoOrd
的变量之间执行交换。