Несовпадение типа Vb6 с генератором случайных чисел

Я хотел сгенерировать случайное число от 1 до 20 для игры, которую я создаю, и по какой-то причине этот код перестал работать и выдает ошибку несоответствия типов, я пробовал другие генераторы в игре, но получаю ту же ошибку.

Public Counter1 As Integer ' Counters for each reel
Public ArrayImgMid1 As Integer ' Store number to iterate over image arrays
Public ReelPic1 As Variant ' Array of images for each reel
Public Reel1Spin As Long ' Spins for each reel
Public ImgBeth, ImgWallow, ImgDan, ImgChris, ImgCatBug As StdPicture ' Images for reels

Private Sub CmdSpin_Click()

'Enable all timers to imitate spinning
TimerReel1.Enabled = True
TimerReel1.Interval = 100

' Disable spin button
CmdSpin.Enabled = False

' Set all counters to 0
Counter1 = 0

' Generate random number for the first reel to spin
Reel1Num = (CLng(Rnd * 20) + 1) ' This is highlighted when I press debug

person Ashwood    schedule 10.05.2013    source источник


Ответы (1)


Напишите это так:

Dim Reel1Num As Long

Reel1Num = (CLng(Rnd * 20) + 1)

Не используйте Integer в VB6 - он представляет 16-битное целое число со знаком и имеет немного меньшую производительность, чем Long, который на самом деле является 32-битным целым числом со знаком. Таким образом, вы также не столкнетесь с ограничениями с 16-битным типом данных.

Причина, по которой ваш код не работает, заключается в том, что функция Int() не преобразует тип данных значения в тип Integer — она округляет указанное значение до целочисленного значения, но сохраняет его тип данных.

Чтобы преобразовать значение в определенный тип данных, используйте функции CInt(), CLng() и т. д. Но, как я уже сказал, избегайте использования Integer, если это вам особенно не нужно — Long в большинстве случаев лучше.

Изменить:

После того, как вы разместили свой код, я не вижу определения переменной Reel1Num — где она определена? Это Reel1Spin? Если это так, убедитесь, что вы включили опцию Require variable declaration в Tools->Options — по умолчанию она отключена. Если у вас его нет, это очень простой способ выстрелить себе в ногу.

Не связано с вашей ошибкой, но большинство ваших объектов изображения определены неправильно - в VB6 тип переменной должен быть указан для каждой переменной, а не один раз в строке. Итак, в этой строке:

Public ImgBeth, ImgWallow, ImgDan, ImgChris, ImgCatBug As StdPicture

вы действительно создаете только 1 объект StdPicture, все остальные будут вариантами. Правильный способ сделать это:

Public ImgBeth As StdPicture, ImgWallow As StdPicture, ImgDan As StdPicture, _
    ImgChris As StdPicture, ImgCatBug As StdPicture

Помимо этого, я не вижу ничего плохого в вашем коде - у меня на компьютере не установлен VB6. Имейте в виду, что в VB6 есть странный способ борьбы с несоответствием типов, и в некоторых случаях выделенная строка может не быть той, которая вызывает реальную ошибку. Раньше это сводило меня с ума.

person xxbbcc    schedule 10.05.2013
comment
Спасибо за ответ, но он все еще не работает, должно быть, это связано с остальной частью моего кода. Хотя не могу понять - person Ashwood; 12.05.2013
comment
@Lilvlskid Почему бы вам не опубликовать больше своего кода? Возможно, мы сможем вам помочь. - person xxbbcc; 12.05.2013
comment
@xxbbcc Спасибо за информированный ответ с полезными советами для дальнейшего использования, я запустил другую версию игры, и по какой-то причине случайная функция работает. Я бы +1, если бы у меня была репутация. - person Ashwood; 12.05.2013