Array Bounds Check

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Array Bounds Check

Сообщение ne_tapka » 30.04.2005 (Сб) 16:02

Есть прога. Из среды ВБ запускается и работает без ошибок.

Сделал ЕХЕ - при старте "Run-time error 9: Subscript out of range"

В свойствах компиляции поставил галку Remove Array Bounds Check
- ЕХЕ стал работать.

То есть где то есть ошибка, но почему тогда из ВБ запускается? Где её искать? Не хочу так оставлять..

Спасибо

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.04.2005 (Сб) 16:17

Ну код, например, приведи :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 30.04.2005 (Сб) 16:22

Где-то твой Array ограничен. Сделай его динамическим и где надо ReDim'ь. Но код для точного ответа необходим.

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 30.04.2005 (Сб) 16:24

Кода уже дофига :) вот declarations:

Dim surf(640) As Single
Dim Terr(640, 480) As Long

Dim ir As New iR_Engine
Dim interface As New iR_Interface
Dim control As New iR_Control
Dim tex As New iR_TextureFactory

Private Type Explosion_Smoke
Sp(20) As iR_Sprite
Angle(20) As Single
Color(2) As Single
Size As Single
End Type
Dim Explosion_Smoke(10) As Explosion_Smoke

Private Type Explosion
Sp As iR_Sprite
Flag As Byte 'expl
PosX As Integer
Size As Single
MaxSize As Single
Fall As iR_Sprite
FallL As Single
FallT As Single
TerFlag As Byte
Fire As iR_Sprite
Color(2) As Single
End Type
Dim Explosion(10) As Explosion

Private Type Player1
Sp As iR_Sprite
St As iR_Sprite
PosX As Integer
Angle As Single
Power As Single
HP As Integer
FallingFlag As Byte
End Type
Dim Player1 As Player1

Dim sprite_terrain As iR_Sprite
Dim sprite_background As iR_Sprite
Dim sprite_player1 As iR_Sprite

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.04.2005 (Сб) 16:29

Ы...
Ненавижу неполную форму задания массивов.
Даже смотреть не буду :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 30.04.2005 (Сб) 16:33

GSerg
неполную это как? (640) вместо (0 to 640) ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.04.2005 (Сб) 16:40

GSerg писал(а):Ы...
Ненавижу неполную форму задания массивов.

Ха, а ещё дотнетчик :twisted:
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.04.2005 (Сб) 16:40

А это не мешает мне ненавидеть неполную форму ещё и там :)
Последний раз редактировалось GSerg 30.04.2005 (Сб) 16:54, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 30.04.2005 (Сб) 16:45

Поправил. Всё тоже самое.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.04.2005 (Сб) 16:53

Поправил на что?
В массиве (0 to 640) 641 элемент. Это так и должно быть? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 30.04.2005 (Сб) 16:59

GSerg
угу :) обращайся я по неверному индексу - из ВБ бы тоже вылитало...а так вылетает тока ЕХЕ..

Это не может быть из за того что переменная называется так же как тип? (dim a as a)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.05.2005 (Вс) 20:07

Нет, не может.
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 01.05.2005 (Вс) 21:40

MSDN писал(а):Turns off error checking for valid array indexes and the correct number of dimensions of the array.

By default Visual Basic makes a check on every access to an array to determine if the index is within the range of the array. If the index is outside the bounds of the array, an error is returned. Selecting this option will turn off this error checking, which can speed up array manipulation significantly. However, if your program accesses an array with an index that is out of bounds, invalid memory locations may be accessed without warning. This can cause unexpected behavior or program crashes.


Значит у тебя где то интересный глюк.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.05.2005 (Пн) 1:43

Убрать галку Remove Array Bounds Checks. Поставить галку Include Symbolic Debug Info на той же закладке в свойствах проекта, с который вызывается список оптимизаций при компиляции. В предполагаемом месте вылета поставить вызов DebugBreak(). После отработки функции вываливаешься в системный дебаггер, и уже в нем все смотришь.

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 03.05.2005 (Вт) 2:52

Интересно, почему ошибка не вылетает из среды ВБ. Вед когда обращаешься по неверному индексу - всегда вылетает..

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.05.2005 (Вт) 15:03

ne_tapka писал(а):Интересно, почему ошибка не вылетает из среды ВБ. Вед когда обращаешься по неверному индексу - всегда вылетает..

Если тебе это действительно интересно, то рекомендую воспользоваться вышеприведенным рецептом. Только прогу с вызовом DebugBreak() из-под среды не запускай, а то будешь дебажить сам VB :).


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 36

    TopList