Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Форум группы: delphi > Какие ошибки могут быть в коде? |
Автор: THandle 11.12.2009, 22:41 | ||
Всем привет. Имеется к примеру вот такая процедурка(взято абстрактно):
Какие в ней вообще могут возникнуть ошибки? ![]() С помощью одного моего начинающего товарища мне удалось выявить по крайней мере возникновение одного типа ошибки в данном коде. Углубимся в историю: я дал ему модуль с какими-то функциями. Он вызывал их, и одну, решив что так для него будет удобнее вызвал так, что потом жаловался мне в том что мой модуль не правильно работает ![]() Предложения? ![]() |
Автор: Rrader 12.12.2009, 17:35 | ||
Вот так можно ![]()
|
Автор: Akella 12.12.2009, 19:01 |
А по другому и нельзя. Вопрос в том, какие могут быть ошибки? |
Автор: THandle 12.12.2009, 19:17 | ||||
У меня смысл ошибки заключался в том, что человек вызвал процедуру следующим образом:
Человеку не нужен был результат, а волновали только действия внутри функции. ![]() Кстати, Rrader, подобные методы от тебя пошли насколько помню по нашему форуму ![]() И к тебе у меня вопрос: Ты показывал такие примеры на WinAPI функциях. Как там обрабатываются значения типа этого PInteger(Nil)^ ? Просто идет глушение ошибок или же есть какая-то проверка вроде:
??? И мне интересно - как еще можно поизвращаться с чем нибудь в этой простейшей процедуре? ![]() |
Автор: THandle 12.12.2009, 20:44 | ||||
А что ты там хотел написать? ![]() Понятно, спасибо ![]() Имеется ввиду как раз вот такие случаи:
А так же при каких обстоятельствах они могут возникнуть ![]() |
Автор: REZiaMIX 21.3.2011, 16:03 |
Я ужасный некрофил, но данный пример используется часто для демонстрации ошибки: SomeProc(MAX_INT,MAX_INT,...); выйдет совершенно не тот результат, которого ожидали ;) |
Автор: roschinspb 22.3.2011, 18:44 | ||||||
Проверку на пустоту можно сделать так:
Если приведение типов использовать бездумно, можно скольугодно много нагородить такого:
А это уже как повезет, может прокатить, а может и нет:
|
Автор: CodeMonkey 22.3.2011, 18:57 | ||
Ну так для таких случаев и прототип ведь другой используется. PInteger называется. А не var Integer. Правило простое: - Видим PInteger - вероятно, функция примет nil. - Видим var Integer/out Integer - функция nil не примет. Достаточно прозрачная логика. А var с nil - это кривейшая кривость. Всё равно что Self на nil проверять. Как ремни безопасности - пожалуйста. Как штатная логика - пристрелить на месте. |
Автор: roschinspb 23.3.2011, 12:11 | ||
Наверно в книжках "Библия Pascal/Delphi/С/++/# для профессионалов" ![]() P.S. формально говоря ошибка то не в процедуре, а вне её. |
Автор: Romkin 26.3.2011, 22:35 |
CodeMonkey, все правильно. var - значит что параметр обязан быть, причем нужного типа. Ассерты, конечно, есть, но на такое писать никаких проверок не хватит. Ну проверил на nil, и что? Он же получит отлуп и подаст PInteger(Form1)^ например. ![]() |