Проблема с аргументом VBA Excel DLL — 6-й аргументC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема с аргументом VBA Excel DLL — 6-й аргумент

Сообщение Anonymous »

Итак, у меня есть код VBA, который вызывает код DLL. Код DLL работает нормально, код VBA работает нормально, ПОКА я не вызову функцию DLL из VBA. По какой-то причине шестой аргумент передается неправильно. Я проверил, добавив 7-й аргумент и передав одно и то же значение в 6-й и 7-й аргументы - 7-й проходит нормально, 6-й передает одно и то же большое (неправильное) значение. Я понятия не имею, что происходит.

VBA:

Код: Выделить всё

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
Объявление функции DLL:

Код: Выделить всё

int __stdcall GenerateCUDALMMPaths(double* arrTimes, double* arrRates, double* arrVols, double* retData, int& ArrLength, int& NPaths);
Файл DEF:

Код: Выделить всё

LIBRARY "CUDAFinance"
EXPORTS
CheckExcelArray = CheckExcelArray
GenerateLMMPaths = GenerateLMMPaths
GenerateCUDALMMPaths = GenerateCUDALMMPaths
У кого-нибудь есть идеи? Я совсем запутался.

Подробнее здесь: https://stackoverflow.com/questions/226 ... ue-6th-arg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»