J'ai bien l'impression qu'il s'agit d'un problème avec les pointeurs désignés par les variables de type Integer (*.i) qui semblent être mal interprété par PB x32 tournant sur une machine x64.
Présentement, je n'arrive pas reproduire le bogue mentionné. Je mets une version minimale avec la commande qui semble problématique. Ce que j'aimerais savoir c'est quelle Macro qui bogue parce que là, cela défie toute logique. Je ne comprends pas ce qui se passe.
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Minimum of two Values
Macro MinValue(P_Min, P_Value01, P_Value02)
P_Min = P_Value01
If P_Value02 < P_Min
P_Min = P_Value02
EndIf
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Random Min Max Real (Float or Double)
Macro RandomMinMaxReal(Min, Max, Resolution = 10000)
((Min) + ((Max) - (Min)) * Random(Resolution) / (Resolution))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; NewLongVector
Macro NewLongVector(ElementCount)
AllocateMemory((ElementCount) * SizeOf(Long))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; DeleteLongVector
Macro DeleteLongVector(StartPtr)
If StartPtr <> #Null
FreeMemory(StartPtr)
EndIf
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; ReachLongVectorElement
Macro ReachLongVectorElement(StartPtr, Index)
(StartPtr + Index * SizeOf(Long))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; SetLongVectorElement
Macro SetLongVectorElement(StartPtr, Index, Value)
PokeL(ReachLongVectorElement(StartPtr, Index), Value)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GetLongVectorElement
Macro GetLongVectorElement(StartPtr, Index)
PeekL(ReachLongVectorElement(StartPtr, Index))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<
Structure Matrix
Line.u
Row.u
Size.q
Elements.i
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<
Macro GetMatrixLine(MatrixA)
MatrixA\Line
EndMacro
Macro GetMatrixRow(MatrixA)
MatrixA\Row
EndMacro
Macro GetMatrixSize(MatrixA)
MatrixA\Size
EndMacro
Macro GetMatrixElements(MatrixA)
MatrixA\Elements
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<
Macro SetMatrixLine(MatrixA, P_Line)
GetMatrixLine(MatrixA) = P_Line
EndMacro
Macro SetMatrixRow(MatrixA, P_Row)
GetMatrixRow(MatrixA) = P_Row
EndMacro
Macro SetMatrixSize(MatrixA, P_Size)
GetMatrixSize(MatrixA) = P_Size
EndMacro
Macro SetMatrixElements(MatrixA, P_Elements)
GetMatrixElements(MatrixA) = P_Elements
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Complentemary Macros for Datas <<<<<
Macro ReachMatrixElement(MatrixA, OffsetID)
(GetMatrixElements(MatrixA) + OffsetID * SizeOf(Double))
EndMacro
Macro AllocateMatrixElementsMemory(MatrixA)
SetMatrixElements(MatrixA, AllocateMemory(GetMatrixSize(MatrixA) * SizeOf(Double)))
EndMacro
Macro MemoryMatrixElementsSize(MatrixA)
MemorySize(GetMatrixElements(MatrixA))
EndMacro
Macro LastMatrixElements(MatrixA)
((MemorySize(GetMatrixElements(MatrixA)) / SizeOf(Double)) - 1)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operator <<<<<
Macro ResetMatrix(MatrixA)
SetMatrixLine(MatrixA, 0)
SetMatrixRow(MatrixA, 0)
SetMatrixSize(MatrixA, 0)
If GetMatrixElements(MatrixA) <> #Null
FreeMemory(GetMatrixElements(MatrixA))
SetMatrixElements(MatrixA, 0)
EndIf
; ClearStructure(MatrixA, Matrix)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy Operator : A = Source : B = Destination <<<<<
Macro CopyMatrix(MatrixA, MatrixB)
SetMatrixLine(MatrixB, GetMatrixLine(MatrixA))
SetMatrixRow(MatrixB, GetMatrixRow(MatrixA))
SetMatrixSize(MatrixB, GetMatrixSize(MatrixA))
If GetMatrixElements(MatrixB) <> #Null
FreeMemory(GetMatrixElements(MatrixB))
EndIf
AllocateMatrixElementsMemory(MatrixB)
If GetMatrixElements(MatrixB) <> #Null
CopyMemory(GetMatrixElements(MatrixA), GetMatrixElements(MatrixB), MemorySize(GetMatrixElements(MatrixA)))
EndIf
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Offset 2D to 1D calculation <<<<<
Procedure.q CalulateOffset1D(RowMax.u, LineID.u, RowID.u)
If LineID = 0 And RowID = 0
Offset1D.q = 0
ElseIf RowID > 0
Offset1D = RowID + LineID * RowMax
ElseIf LineID > 0
Offset1D = LineID * RowMax
EndIf
ProcedureReturn Offset1D
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Matrix Element Mutator <<<<<
Macro Private_SetMatrixElement(MatrixA, P_Line, P_Row, P_Element)
PokeD(ReachMatrixElement(MatrixA, CalulateOffset1D(GetMatrixRow(MatrixA), P_Line, P_Row)), P_Element)
EndMacro
Procedure SetMatrixElement(*MatrixA.Matrix, P_Line.u, P_Row.u, P_Element.d)
If P_Line <= GetMatrixLine(*MatrixA) - 1 And P_Row <= GetMatrixRow(*MatrixA) - 1
Private_SetMatrixElement(*MatrixA, P_Line, P_Row, P_Element)
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Matrix Element Observator <<<<<
Macro Private_GetMatrixElement(MatrixA, P_Line, P_Row)
PeekD(ReachMatrixElement(MatrixA, CalulateOffset1D(GetMatrixRow(MatrixA), P_Line, P_Row)))
EndMacro
Procedure.d GetMatrixElement(*MatrixA.Matrix, P_Line.u, P_Row.u)
If P_Line <= GetMatrixLine(*MatrixA) - 1 And P_Row <= GetMatrixRow(*MatrixA) - 1
P_Element.d = Private_GetMatrixElement(*MatrixA, P_Line, P_Row)
EndIf
ProcedureReturn P_Element
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The CreateNewMatrix Operator <<<<<
Procedure CreateNewMatrix(*MatrixA.Matrix, P_Line.u, P_Row.u, CreatorCommand.s = "CreateNewMatrix()")
If P_Line < 1
P_Line = 1
EndIf
If P_Row < 1
P_Row = 1
EndIf
If GetMatrixElements(*MatrixA) <> #Null
ResetMatrix(*MatrixA)
EndIf
SetMatrixLine(*MatrixA, P_Line)
SetMatrixRow(*MatrixA, P_Row)
SetMatrixSize(*MatrixA, GetMatrixLine(*MatrixA) * GetMatrixRow(*MatrixA))
AllocateMatrixElementsMemory(*MatrixA)
If GetMatrixElements(*MatrixA) = #Null
MessageRequester("Fatal Error", CreatorCommand + " - Impossible To Allocate Memory !")
End
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The ZeroMatrix Operator <<<<<
Procedure ZeroMatrix(*MatrixA.Matrix, P_Line.u, P_Row.u)
CreateNewMatrix(*MatrixA, P_Line, P_Row, "ZeroMatrix()")
For OffsetID = 0 To GetMatrixSize(*MatrixA) - 1
PokeD(ReachMatrixElement(*MatrixA, OffsetID), 0.0)
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The OneMatrix Operator <<<<<
Procedure OneMatrix(*MatrixA.Matrix, P_Line.u, P_Row.u)
CreateNewMatrix(*MatrixA, P_Line, P_Row, "OneMatrix()")
For OffsetID = 0 To GetMatrixSize(*MatrixA) - 1
PokeD(ReachMatrixElement(*MatrixA, OffsetID), 1.0)
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The RandomMatrix Operator <<<<<
Procedure RandomMatrix(*MatrixA.Matrix, P_Line.u, P_Row.u, P_Min.d, P_Max.d, P_Resolution.l = 10000)
CreateNewMatrix(*MatrixA, P_Line, P_Row, "RandomMatrix()")
For OffsetID = 0 To GetMatrixSize(*MatrixA) - 1
PokeD(ReachMatrixElement(*MatrixA, OffsetID), RandomMinMaxReal(P_Min, P_Max, P_Resolution))
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The ExtractMatrixDiagonal Operator <<<<<
Procedure ExtractMatrixDiagonal(*Diagonal.Matrix, *MatrixA.Matrix)
;MinValue(Min.u, GetMatrixLine(*MatrixA), GetMatrixRow(*MatrixA))
Min = GetMatrixLine(*MatrixA)
If GetMatrixRow(*MatrixA) < P_Min
Min = GetMatrixRow(*MatrixA)
EndIf
ZeroMatrix(*Diagonal, Min, 1)
For PivotID = 0 To Min - 1
Element.d = Private_GetMatrixElement(*MatrixA, PivotID, PivotID)
Debug Element
Private_SetMatrixElement(*Diagonal, PivotID, 0, Element)
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur DebugMatrix <<<<<
Procedure DebugMatrix(*MatrixA.Matrix, P_Decimal.b = 3)
For LineID = 0 To GetMatrixLine(*MatrixA) - 1
For RowID = 0 To GetMatrixRow(*MatrixA) - 1
Line.s = Line + StrD(Private_GetMatrixElement(*MatrixA, LineID, RowID), P_Decimal)
If RowID < GetMatrixRow(*MatrixA) - 1
Line + ", "
EndIf
Next
Debug "[" + Line + "]"
Line = ""
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<<
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<<
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Random Matrix"
RandomMatrix(RandomMatrix.Matrix, 5, 5, -9.0, 9.0)
DebugMatrix(RandomMatrix)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Random Matrix Diagonal"
ExtractMatrixDiagonal(Diagonal.Matrix, RandomMatrix)
DebugMatrix(Diagonal)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; <<<<< END OF DEMONSTRATION <<<<<"
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Je vais si je peux reproduire le problème.