Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-13208
Программер
2003-05-26 14:37
2003.06.05
Как сделать Fullscreen


1-13188
Endi
2003-05-26 20:44
2003.06.05
Странности при смене компьютеров


1-13238
kruzoman
2003-05-27 14:25
2003.06.05
как получить параметры


14-13460
eLVik
2003-05-20 12:48
2003.06.05
Компонент


4-13525
sucer
2003-04-02 17:58
2003.06.05
Какой нужен код в процедуре обработке HOOK для отлова MAXIMIZE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский