![]() |
Модераторы: THandle, bems |
![]() ![]() ![]() |
|
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 7 Всего: 372 |
Всем привет.
Имеется к примеру вот такая процедурка(взято абстрактно):
Какие в ней вообще могут возникнуть ошибки? ![]() С помощью одного моего начинающего товарища мне удалось выявить по крайней мере возникновение одного типа ошибки в данном коде. Углубимся в историю: я дал ему модуль с какими-то функциями. Он вызывал их, и одну, решив что так для него будет удобнее вызвал так, что потом жаловался мне в том что мой модуль не правильно работает ![]() Предложения? ![]() |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: нет Всего: 191 |
Вот так можно
![]()
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 7 Всего: 329 |
||||
|
||||
THandle |
|
||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 7 Всего: 372 |
У меня смысл ошибки заключался в том, что человек вызвал процедуру следующим образом:
Человеку не нужен был результат, а волновали только действия внутри функции. ![]() Кстати, Rrader, подобные методы от тебя пошли насколько помню по нашему форуму ![]() И к тебе у меня вопрос: Ты показывал такие примеры на WinAPI функциях. Как там обрабатываются значения типа этого PInteger(Nil)^ ? Просто идет глушение ошибок или же есть какая-то проверка вроде:
??? И мне интересно - как еще можно поизвращаться с чем нибудь в этой простейшей процедуре? ![]() |
||||
|
|||||
Rrader |
|
||||||||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: нет Всего: 191 |
THandle, я когда увидел тему, я в шоке легком был. Потому что я зашел в клуб, чтобы создать подобную тему
![]()
Я лишь напомнил, эта практика давно была известна многим программистам Delphi. Это как с последовательностью Фибоначчи, ее знали египтяне, а называется она по имени средневекового математика ![]() Ну, например, GetWindowThreadProcessId:
Просто проверка на не NULL (0). Функция получает указатель на входе. А теперь смотрим, что Delphi передает:
Добавлено через 3 минуты и 12 секунд
Что имеется в виду? |
||||||||||
|
|||||||||||
THandle |
|
||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 7 Всего: 372 |
А что ты там хотел написать? ![]() Понятно, спасибо ![]() Имеется ввиду как раз вот такие случаи:
А так же при каких обстоятельствах они могут возникнуть ![]() |
||||
|
|||||
REZiaMIX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Я ужасный некрофил, но данный пример используется часто для демонстрации ошибки:
SomeProc(MAX_INT,MAX_INT,...); выйдет совершенно не тот результат, которого ожидали ;) -------------------- ![]() |
|||
|
||||
roschinspb |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 27.1.2010 Где: С-Пб Репутация: нет Всего: нет |
Проверку на пустоту можно сделать так:
Если приведение типов использовать бездумно, можно скольугодно много нагородить такого:
А это уже как повезет, может прокатить, а может и нет:
|
||||||
|
|||||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
Ну так для таких случаев и прототип ведь другой используется. PInteger называется. А не var Integer. Правило простое: - Видим PInteger - вероятно, функция примет nil. - Видим var Integer/out Integer - функция nil не примет. Достаточно прозрачная логика. А var с nil - это кривейшая кривость. Всё равно что Self на nil проверять. Как ремни безопасности - пожалуйста. Как штатная логика - пристрелить на месте. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
roschinspb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 27.1.2010 Где: С-Пб Репутация: нет Всего: нет |
Наверно в книжках "Библия Pascal/Delphi/С/++/# для профессионалов" ![]() P.S. формально говоря ошибка то не в процедуре, а вне её. |
|||
|
||||
Romkin |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
CodeMonkey, все правильно. var - значит что параметр обязан быть, причем нужного типа.
Ассерты, конечно, есть, но на такое писать никаких проверок не хватит. Ну проверил на nil, и что? Он же получит отлуп и подаст PInteger(Form1)^ например. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi" | |
|
Добро пожаловать в форум группы "Delphi". В разделе разрешается:
Строго запрещено:
Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Форум группы: delphi | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |