Целочисленное переполнение в проекте VBA - PullRequest
0 голосов
/ 19 апреля 2010

все. Вот небольшая функция VBA (Excel), которую я написал, полная MsgBoxes для отладки.

Я передаю числа 10 и 1 в качестве аргументов и получаю ошибку переполнения, когда программа достигает вершины цикла For, прежде чем она начнет первую итерацию.

Любые мысли приветствуются.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function PerformanceTest(iterations As Integer, interval As Integer) As Double
    Dim st, tot, k As Double
    Dim n As Integer
    tot = 0#
    MsgBox "ok"
    k = iterations + tot
    MsgBox "ookk"
    n = 1
    MsgBox "assigned"
    For n = 1 To iterations
        MsgBox n
        st = Timer
        Application.Calculate
        tot = tot + (Timer - st)
        Sleep (1000 * interval)
    Next n
    'MsgBox (tot / k)
    PerformancTest = tot / k
End Function

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Избыточность удалена, практически без изменений функция работает без ошибок в моем Excel 2003

Function PerformanceTest(iterations As Integer, interval As Integer) As Double
  Dim st, tot As Double
  Dim n As Integer

  For n = 1 To iterations
    st = Timer
    Application.Calculate
    tot = tot + Timer - st
    ''# Sleep (1000 * interval)
  Next n

  PerformanceTest = tot / (iterations + tot)
End Function

Итак ... ошибка, которую вы видите, вероятно, не в самой функции.

P.S .: Pro tip: ;-) Используйте Debug.Print вместо MsgBox для вывода отладки.

0 голосов
/ 20 апреля 2010

С риском выглядеть дураком, вот некоторые данные.

Я бы построил свою функцию таймера следующим образом. Это кажется мне проще. (Не считая того, что я удалил некоторые несущественные строки - я имею в виду, что это структурно просто.)

И если бы он работал без переполнения, это был бы хороший плюс.

Function PerformanceTest(iterations As Integer, interval As Integer) As Double

Dim st, tot, k As Double
Dim n As Integer

PerformanceTest = Timer
k = iterations + tot
n = 1

For n = 1 To iterations
    '' insert operation that takes time
    Sleep (1000 * interval)
Next n

PerformanceTest = Timer - PerformanceTest
PerformanceTest = PerformanceTest / k
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...