使用具有用户定义类型的 QB64 函数 SWAP 的分段错误问题
Segmentation fault issue using the QB64 function SWAP with user-defined types
我正在尝试使用 QB64 V1.2 编译 QB 程序 DIMORDIN.BAS(旧 QB4.5 包中包含的示例)。
编译没有提示错误,但是程序的执行却出人意料...大多数排序类型的执行都导致了段错误。
调试代码我发现导致此结果的原因是语言函数 SWAP
,根据证据,该函数无法交换复杂的 and/or 用户定义类型。这样的行:SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)
给出分段错误。
你有解决办法吗?为什么 QB64 不符合 QB4.5 的这个特性?
下面的代码是一个SUB的原始代码,它给出了分段错误(不幸的是我只有意大利语版本)。
我无法在此处 post 完整代码,因为它超过了 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
我编写了以下小代码来演示函数 SWAP
生成的问题:
$CONSOLE:ONLY
_DEST _CONSOLE
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
DIM a(1 TO 43) AS TipoOrd
a(1).Lung = 2: a(2).Lung = 4
PRINT a(1).Lung, a(2).Lung
SWAP a(1), a(2)
PRINT a(1).Lung, a(2).Lung
END
喝完咖啡后,我解决了编写子例程 SWAPT
的问题,该子例程执行用户定义类型 TipoOrd
变量之间的交换 TipoOrd
.
我用 SWAPT
子例程替换 SWAP
函数后,程序正确 运行.
但是QB64和QB4.5不兼容的问题依然存在
这里是修改后的函数和SWAPT
子程序:
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
REM SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)
SWAPT 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 SWAPT (a AS TipoOrd, b AS TipoOrd)
SWAP a.Lung, b.Lung
SWAP a.ValColore, b.ValColore
SWAP a.StringaBarra, b.StringaBarra
END SUB
我已经编写了用于交换结构的 QB64 v1.3a 代码并取得了一些成功:
TYPE Struct1
Element1 AS INTEGER
Element2 AS INTEGER
END TYPE
DIM SHARED StructA(10) AS Struct1
DIM SHARED StructB(10) AS Struct1
StructA(1).Element1 = -1
StructB(1).Element1 = 1
PRINT "StructA="; StructA(1).Element1
PRINT "StructB="; StructB(1).Element1
PRINT "Swap:"
SWAP StructA(1), StructB(1)
PRINT "StructA="; StructA(1).Element1
PRINT "StructB="; StructB(1).Element1
END
我正在尝试使用 QB64 V1.2 编译 QB 程序 DIMORDIN.BAS(旧 QB4.5 包中包含的示例)。
编译没有提示错误,但是程序的执行却出人意料...大多数排序类型的执行都导致了段错误。
调试代码我发现导致此结果的原因是语言函数 SWAP
,根据证据,该函数无法交换复杂的 and/or 用户定义类型。这样的行:SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)
给出分段错误。
你有解决办法吗?为什么 QB64 不符合 QB4.5 的这个特性?
下面的代码是一个SUB的原始代码,它给出了分段错误(不幸的是我只有意大利语版本)。
我无法在此处 post 完整代码,因为它超过了 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
我编写了以下小代码来演示函数 SWAP
生成的问题:
$CONSOLE:ONLY
_DEST _CONSOLE
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
DIM a(1 TO 43) AS TipoOrd
a(1).Lung = 2: a(2).Lung = 4
PRINT a(1).Lung, a(2).Lung
SWAP a(1), a(2)
PRINT a(1).Lung, a(2).Lung
END
喝完咖啡后,我解决了编写子例程 SWAPT
的问题,该子例程执行用户定义类型 TipoOrd
变量之间的交换 TipoOrd
.
我用 SWAPT
子例程替换 SWAP
函数后,程序正确 运行.
但是QB64和QB4.5不兼容的问题依然存在
这里是修改后的函数和SWAPT
子程序:
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
REM SWAP MatrOrd(Riga), MatrOrd(Riga + Scarto)
SWAPT 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 SWAPT (a AS TipoOrd, b AS TipoOrd)
SWAP a.Lung, b.Lung
SWAP a.ValColore, b.ValColore
SWAP a.StringaBarra, b.StringaBarra
END SUB
我已经编写了用于交换结构的 QB64 v1.3a 代码并取得了一些成功:
TYPE Struct1
Element1 AS INTEGER
Element2 AS INTEGER
END TYPE
DIM SHARED StructA(10) AS Struct1
DIM SHARED StructB(10) AS Struct1
StructA(1).Element1 = -1
StructB(1).Element1 = 1
PRINT "StructA="; StructA(1).Element1
PRINT "StructB="; StructB(1).Element1
PRINT "Swap:"
SWAP StructA(1), StructB(1)
PRINT "StructA="; StructA(1).Element1
PRINT "StructB="; StructB(1).Element1
END