Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.05;
Скачать: CL | DM;

Вниз

Нашёл ошибку компилятора 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
9-12987
MRB_SPB
2002-12-24 18:01
2003.06.05
Скелетная анимация


14-13393
Maximov
2003-05-17 10:17
2003.06.05
Поиск неработает? Или это только у меня глюки?


1-13299
KA-87
2003-05-24 12:45
2003.06.05
А как в программе можно реализовать подсветку синтаксиса?


1-13294
vitall
2003-05-24 05:55
2003.06.05
данные местоположения курсора в строке(TMemo etc)


1-13271
Seldon
2003-05-23 21:14
2003.06.05
ExtractIconEx