Итак, у меня есть код VBA, который вызывает код DLL. Код DLL работает нормально, код VBA работает нормально, ПОКА я не вызову функцию DLL из VBA. По какой-то причине шестой аргумент передается неправильно. Я проверил, добавив 7-й аргумент и передав одно и то же значение в 6-й и 7-й аргументы - 7-й проходит нормально, 6-й передает одно и то же большое (неправильное) значение. Я понятия не имею, что происходит.
Option Explicit
' Declare the LMM Function that's in the DLL
Declare PtrSafe Function GenCudaLMMPaths Lib "C:\Path to DLL\LMMExcel.dll" Alias "GenerateCUDALMMPaths" (xTimes#, xRates#, xVols#, xRData#, ByRef ArrLen As Long, ByRef NPaths As Long) As Long
' Generate LMM Paths on Click
Sub LMM_Click()
Dim Times#(), Rates#(), Vols#()
Dim x As Long
Dim y As Long
Dim rTimes As Range
Dim rRates As Range
Dim rVols As Range
Dim cell As Range
Dim sz As Long
sz = 15
' Resize
ReDim Times(sz), Rates(sz), Vols(sz)
' Fill in Data
Set rTimes = Sheets("Market").Range("C2:Q2")
x = 1
For Each cell In rTimes
Times(x) = cell.Value
x = x + 1
Next
Set rRates = Sheets("Market").Range("C5:Q5")
x = 1
For Each cell In rRates
Rates(x) = cell.Value
x = x + 1
Next
Set rVols = Sheets("Market").Range("C4:Q4")
x = 1
For Each cell In rVols
Vols(x) = cell.Value / 10000
x = x + 1
Next
'Call the Function
Dim np As Long
np = Sheets("LMM").Range("C2").Value
Dim useCuda As Boolean
If Sheets("LMM").Range("C3").Value = "GPU" Then
useCuda = True
Else
useCuda = False
End If
Dim rData#()
Dim rValue
ReDim rData(np * sz * (sz + 3))
rValue = GenCudaLMMPaths(Times(1), Rates(1), Vols(1), rData(1), sz, np)
If rValue = -1 Then
'No CUDA Card
MsgBox ("Your system doesn't have a CUDA Enabled GPU")
ElseIf rValue = 1 Then
'Error Occurred
MsgBox ("An error occurred while trying to generate LMM paths")
ElseIf rValue = 0 Then
'Success
' Need to reformat return data
Dim fmtData()
ReDim fmtData(np * sz, sz)
Dim i, j, k
For i = 0 To np - 1
For j = 0 To np - 1
For k = 0 To np - 1
fmtData(((i * sz) + j) + 1, k + 1) = rData(((i * sz * sz) + (j * sz) + k) + 1)
Next k
Next j
Next i
'Fill in data
Sheets("LMM").Range("A8:K" & (np * sz)) = fmtData
Else
'Too many requested paths for this CUDA card
MsgBox ("In order to prevent GPU Lock-up, you cannot request more than " & rValue & " paths.")
Sheets("LMM").Range("C2").Value = rValue
End If
End Sub
Итак, у меня есть код VBA, который вызывает код DLL. Код DLL работает нормально, код VBA работает нормально, ПОКА я не вызову функцию DLL из VBA. По какой-то причине шестой аргумент передается неправильно. Я проверил, добавив 7-й аргумент и передав одно и то же значение в 6-й и 7-й аргументы - 7-й проходит нормально, 6-й передает одно и то же большое (неправильное) значение. Я понятия не имею, что происходит.
VBA:
[code]Option Explicit
' Declare the LMM Function that's in the DLL Declare PtrSafe Function GenCudaLMMPaths Lib "C:\Path to DLL\LMMExcel.dll" Alias "GenerateCUDALMMPaths" (xTimes#, xRates#, xVols#, xRData#, ByRef ArrLen As Long, ByRef NPaths As Long) As Long
' Generate LMM Paths on Click Sub LMM_Click()
Dim Times#(), Rates#(), Vols#()
Dim x As Long Dim y As Long Dim rTimes As Range Dim rRates As Range Dim rVols As Range Dim cell As Range
Dim sz As Long sz = 15
' Resize ReDim Times(sz), Rates(sz), Vols(sz)
' Fill in Data Set rTimes = Sheets("Market").Range("C2:Q2")
x = 1 For Each cell In rTimes Times(x) = cell.Value x = x + 1 Next
Set rRates = Sheets("Market").Range("C5:Q5")
x = 1 For Each cell In rRates Rates(x) = cell.Value x = x + 1 Next
Set rVols = Sheets("Market").Range("C4:Q4")
x = 1 For Each cell In rVols Vols(x) = cell.Value / 10000 x = x + 1 Next
'Call the Function Dim np As Long
np = Sheets("LMM").Range("C2").Value
Dim useCuda As Boolean
If Sheets("LMM").Range("C3").Value = "GPU" Then useCuda = True Else useCuda = False End If
If rValue = -1 Then 'No CUDA Card MsgBox ("Your system doesn't have a CUDA Enabled GPU") ElseIf rValue = 1 Then 'Error Occurred MsgBox ("An error occurred while trying to generate LMM paths") ElseIf rValue = 0 Then 'Success ' Need to reformat return data Dim fmtData()
ReDim fmtData(np * sz, sz)
Dim i, j, k
For i = 0 To np - 1 For j = 0 To np - 1 For k = 0 To np - 1 fmtData(((i * sz) + j) + 1, k + 1) = rData(((i * sz * sz) + (j * sz) + k) + 1) Next k Next j Next i
'Fill in data Sheets("LMM").Range("A8:K" & (np * sz)) = fmtData Else 'Too many requested paths for this CUDA card MsgBox ("In order to prevent GPU Lock-up, you cannot request more than " & rValue & " paths.") Sheets("LMM").Range("C2").Value = rValue End If