Форум: "Потрепаться";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];
ВнизНашёл ошибку компилятора Delphi 6 Найти похожие ветки
← →
cyborg (2003-05-19 14:35) [0]Вполне серьёзную.
В общем сижу, делаю игру, и такой глюк, герой дохнет от безобидного монстра у которого сила атаки 0. И вот и так, и так, всё проверил перепроверил и код и параметры компиляции, явно видно что всё должно работать, а не работает, глючит по чёрному. Потом нашёл, догадался :).
Дело всё в использовании типа Integer, в Delphi это тот же LongInt.
вот в такой записи хранятся данные монстра:
TDataMonster = record
Life : Integer;
Power : Byte;
...
end;
Доступ к ним идёт через указатели Data : Pointer;
TDataMonster(Data^).Power
по идее должно иметь значение TDataMonster.Power, но это не так, видимо где-то глюк в компиляторе и он такой Integer считает не как Longint, а как старый паскалевский Integer, и возвращает какой-то мусор видимо aдрес @Data+2 вместо @Data+4. Проблема решилась заменой Integer на LongInt;
← →
McSimm (2003-05-19 15:04) [1]Сомнения меня берут, что вышесказанное имеет место быть :)
← →
Игорь Шевченко (2003-05-19 15:26) [2]И меня :) Сдается мне, что глюк далеко не в компиляторе...
← →
Юрий Зотов (2003-05-19 15:30) [3]Да, что-то здесь не так. Уж чего-чего, но чтобы компилятор неверно обрабатывал INTEGER - это просто фантастика.
← →
Malder (2003-05-19 15:30) [4]Ахинея какая-то.
1) зачем вообще объявлять Data : Pointer ? Если я правильно понял, уж лучше Data=^TDataMonster
2)Data^ - каким это образом у тебя получается так компилировать, если Data : Pointer ?
← →
Skier (2003-05-19 15:31) [5]"Нечего на зеркало..." :)
TDataMonster = record
Life : Integer;
Power : Byte;
...
end;
PDataMonster = ^TDataMonster
//..............................
PDataMonster(Data)^.Power
← →
horse (2003-05-19 15:34) [6]> cyborg
Неплохо тут за компилятор подписались ? :)))
← →
Mike B. (2003-05-19 15:36) [7]Вам сюда :)
http://delphimaster.net/view/14-1053015256/
← →
cyborg (2003-05-19 16:36) [8]Почему Pointer, потому, что ещё есть TDataPlayer TDataBomb TDataExplosion все они сидят на этом Data
Блин, у меня уже голова гудит :(, в другом месте теперь тоже самое.
Вот полная запись:
TDataMonster = packed record
Life : LongInt;
Power : byte;
Monster : byte;
MovePath : array[1..10] of TLookTo;
PathNum : Byte;
MoveCount : Byte;
CurrentPathIndex : Byte;
end;
теперьCase TDataMonster(Sprite^.Data^).Monster of
в упор не видит, что хранит TDataMonster.Monster и получает различные значения. Это значение устанавливается в самом начале создания объекта и не меняется.
Похоже это у меня чего-то накрылось в компиляторе :( либо я совсем того :)
Mike B. да, подходит.
← →
kaif (2003-05-19 16:53) [9]А посмотри SizeOf этой структуры. И будет ясно, какой длины integer.
← →
AlexRush (2003-05-19 16:57) [10]>> cyborg © (19.05.03 16:36)>> Не сочти за оскорбление, но иногда помагает переустановка. А вообще-то я ТАКИХ глюков компилятор не делает. Проверь, все ли записи/массивы у тебя с атрибутом packed. У меня когда-то была серьезная проблема из-за того, что не учел выравнивания.
← →
Malder (2003-05-19 17:32) [11]НЕсмотря на игнорирование, хочу ЕЩЕ раз спросить:
каким образом компилируется Data^, если Data: Pointer ?
Или по другому. Как можно разыменовывать нетипизированный указатель ?
Темнишь ты что-то...
← →
Malder (2003-05-19 17:33) [12]НЕсмотря на игнорирование, хочу ЕЩЕ раз спросить:
каким образом компилируется Data^, если Data: Pointer ?
Или по другому. Как можно разыменовывать нетипизированный указатель ?
Темнишь ты что-то...
← →
Malder (2003-05-19 17:35) [13]Я про
>Case TDataMonster(Sprite^.Data^).Monster of
← →
Юрий Зотов (2003-05-19 17:36) [14]> Как можно разыменовывать нетипизированный указатель
Привести его к типизированному. Тем самым сообщаем компилятору тип самих данных.
← →
Ketmar (2003-05-19 17:47) [15]а написать программу так, чтобы не надо было заниматься анальным кодингом -- не судьбец?
← →
Malder (2003-05-19 17:47) [16]Юрий, это понятно. Но почитайте внимательнее, я же говорил про
Data^
, где Data:Pointer
← →
McSimm (2003-05-19 17:48) [17]>Malder © (19.05.03 17:33)
Var P1, P2: Pointer;
......
P1 := @SomeStruct1;
P2 := @SomeStruct2;
Move(P1^, P2^, Sz);
;)
← →
Malder (2003-05-19 17:50) [18]да ну вас. Мастера, блин :-)
← →
cyborg (2003-05-19 20:55) [19]Malder я не игнорировал, у меня в поисках ошибки мозг закипел и я пошёл отдыхать :).
Вообщето тебе уже сказали как получается компилировать.
Вариант использования:
PDataMonster = ^TDataMonster;
TDataMonster = record
Life : Integer;
Size : Integer;
Speed : Integer;
end;
PDataPlayer = ^TDataPlayer;
TDataPlayer = record
Life : Integer;
Size : Integer;
Speed : Integer;
Power : Integer;
end;
TObjData = record
X,Y : Integer;
DataSize : Integer;
Data : Pointer;
end;
В Data у нас могут храниться различные данные, каким способом получить доступ к ним, если указать явно только один тип данных, то мы сможем работать только с этим типом, указав просто указатель мы можем указать компилятору какой тип данных нас интересует:
PDataMonster(ObjData.Data)^.Life;
PDataPlayer(ObjData.Data)^.Power;
Похоже я просто в упор не вижу, где там у меня портятся данные, а не компиллятор виноват, хотя вроде смотрел основательно, сейчас продолжу искать :(. Я уже пробовал и packed и просто, всё также.
← →
Malder (2003-05-19 21:12) [20]Ха, так ты бы так и говорил. А не приводил левый код !
>Case TDataMonster(Sprite^.Data^).Monster of
Я был полностью уверен, что ты это вырезал из своего проекта. На что ти обратил внимания. Ты лучше приведи РЕАЛЬНЫЙ код, который у тебя используется...
← →
cyborg (2003-05-19 23:02) [21]Ураааа... нашёл в чём проблема, ветку можно удалить, так, как тема не соответствует истине :).
У меня в поиске пути лезло в массив, у которого диапазон от 1, а лезло под номером 0, поэтому портились данные до этого массива.
Бац, бац, по рукам - "будешь ещё честное имя компилятора пачкать?" :)
← →
Lancelot (2003-05-19 23:08) [22]
> Ketmar © (19.05.03 17:47)
УРАААААААА! Кетмар появился! И где ж ты так долго пропадал?!!!
← →
Anatoly Podgoretsky (2003-05-19 23:45) [23]А говорил Борланд виноват, а оказалось как всегда :-)
← →
Юрий Зотов (2003-05-20 00:00) [24]А при включенном Range checking эта ошибка была бы найдена мгновенно...
← →
Aristarh (2003-05-20 00:11) [25]>Lancelot © (19.05.03 23:08)
Та не-е-е-е. Эт не Кетмар. Настоящий Кетмар всегда подписывается, а это - жалкая подделка. :-))
← →
Нуу (2003-05-20 02:57) [26]2 Юрий Зотов © (20.05.03 00:00)
> А при включенном Range checking эта ошибка была бы найдена мгновенно...
Да, но только в дебаггере :(((
← →
Anatoly Podgoretsky (2003-05-20 08:37) [27]Нуу ты как всегда сморозил.
← →
AlexRush (2003-05-20 09:30) [28]cyborg © (19.05.03 23:02)>> Тут есть ветка - "Как тупят програмисты", можно смело туда закинуть. Будет и весело и поучительно :)))))))))
← →
VaS (2003-05-20 09:41) [29]Вообще вместо этой ахинеи с записями:
PDataMonster = ^TDataMonster;
TDataMonster = record
Life : Integer;
Size : Integer;
Speed : Integer;
end;
PDataPlayer = ^TDataPlayer;
TDataPlayer = record
Life : Integer;
Size : Integer;
Speed : Integer;
Power : Integer;
end;
явно напрашивается иерархия классов...
← →
cyborg (2003-05-20 10:43) [30]Юрий Зотов © (20.05.03 00:00)
Вчера ответил, но чего-то сервер замолчал, и мессага не дошла оказывается :).
В общем эта тема как раз для ветки как тупят программисты. Включал я проверку, смотрел адрес ошибки, как раз туда указывала, только тупо посмотрю, и не вижу откуда там выход за пределы, и так раз 5 смотрел и не видел, только после начал перебирать код, немного исправлять, увидел, что присваивание номера индекса для обращения к массиву идёт немного позже, чем само обращение, поэтому получался индекс 0.
VaS © (20.05.03 09:41)
Это не ахинея, и классы тут не напрашиваются, всё просто.
Anatoly Podgoretsky © (19.05.03 23:45)
Как всегда на высоте, и весьма точно подмечено, мне интересно читать ваши высказывания :).
Нуу (20.05.03 02:57)
Искать ошибку очень просто, когда, например, DirectX не отдаёт экран, ставишь точку останова в начале программы, запускаешь и ищешь адрес ошибки.
← →
Ketmar (2003-05-20 12:40) [31]>Aristarh © (20.05.03 00:11)
Кэтмар, Кэтмар. а подписывался за меня мой прокси, который приказал жить долго и счастливо.
>cyborg © (20.05.03 10:43)
действительно, это не ахинея, это просто неумение заниматься дизайном софта. кодить научились, а вот думать при этом -- ещё нет. ничего, с тренировками всё будет.
← →
Нуу (2003-05-21 03:11) [32]2 Anatoly Podgoretsky © (20.05.03 08:37)
> Нуу ты как всегда сморозил.
Обидно слышать! "Как всегда" это я принимаю (с оговорками).
Но у меня ВСЕГДА стоит в опциях компилятора "Range Checking". И, нуу очень неудобно при прогоне программы у заказчика видеть сообщение "Range Checking Error" без указания адреса сей ошибки.
2 cyborg © (20.05.03 10:43)
> Нуу (20.05.03 02:57)
Искать ошибку очень просто, когда, например, DirectX не отдаёт экран, ставишь точку останова в начале программы, запускаешь и ищешь адрес ошибки.
Да, приезжаешь к заказчику, где нет Дельфи и "ставишь точку останова" :(((
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c