| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > если функция ничего не возвращает |
| Автор: supervladislav 5.9.2012, 21:51 |
| Скажите , пишу первую функцию ,у меня возник вопрос. Какой возвращаемый результат должен быть у функции если она ничего не возвращает |
| Автор: northener 5.9.2012, 22:21 |
Функция, которая ничего не возвращает называется процедура. procedure |
| Автор: supervladislav 5.9.2012, 22:28 |
| northener, тоесть хотябы да или нет функция должна возвращать так чтоли? Добавлено через 10 минут и 42 секунды Я имел ввиду корректно если функция сработала то она возвращает да в противном нет ,так? |
| Автор: Данкинг 5.9.2012, 23:12 |
| Ну, пиши result:='' |
| Автор: supervladislav 7.9.2012, 16:17 |
| northener, вобще если судить по примеру кода ,то везде где объявляется функция в конце пишется тип возвращаемых данных,но невсегда функция чео либо возвращает. Вобще неплохо было бы об этом написать в книге. |
| Автор: Данкинг 7.9.2012, 16:50 |
Если функция вызывается - то она непременно что-то возвратит. |
| Автор: bems 8.9.2012, 07:43 | ||
|
| Автор: Poseidon 15.9.2012, 15:02 | ||
|
| Автор: БелАмор 15.9.2012, 16:35 | ||||
Вы неправы. Конкретный пример: http://delphikingdom.com/asp/viewitem.asp?catalogid=1435
В Языке Си, например, нет разделения подпрограмм на функции и процедуры. Там всё - функции. Функция, не возвращающая значение, имеет тип void. В Паскале же подпрограммы чётко разделены на функции и процедуры. Если в Паскале подпрограмма не должна возвращать значение, она называется процедурой. Если подпрограмма названа функцией, она обязана что-то вернуть. Причём в любом случае. Если компилятор обнаруживает, что возможна ситуация, при которой переменной Result не будет ничего присвоено, он выдаёт предупреждение. Сразу привыкайте, что при компиляции программы не должно быть ни одного предупреждения, какими бы незначительными они вам ни казались. Вообще, пытаться что-либо писать с такими знаниями - пустая трата времени. Прочитайте какую-нибудь книжку для начинающих, чтобы знать хотя бы самые минимальные основы. Посоветовать что-то конкретное я не могу, но по содержанию можно ориентироваться, например, на эту книгу: http://www.bhv.ru/books/full_contents.php?id=189915 Вас должны интересовать главы до 28. Ваш нынешний вопрос относится к страницам 53 и 55. |
| Автор: lomaster 15.9.2012, 17:00 |
| Чтобы функция не возвращала результат, возбудите исключение, но и ловить не забудте. Если логика кода может или не может возвращать, то тут надо смотреть на суть. От этого зависит что применить функцию или процедуру. |
| Автор: БелАмор 15.9.2012, 17:42 |
| Кстати, для начала можно почитать этот цикл статей: http://delphikingdom.com/lyceum/seminar.asp?ID=6 Написано всё это достаточно давно, поэтому там нет многих нововведений, в частности, ничего не говорится о вопросах, связанных с поддержкой Юникода, но познакомиться с самыми азами - вполне. |
| Автор: Poseidon 15.9.2012, 18:58 | ||||||
| Вы не умеете читать Ваше
Мое
Есть принципиальные отличия? Особенно если мы говорим про такой нестандартный в практике вопрос. Добавлено через 2 минуты и 12 секунд
|
| Автор: bems 15.9.2012, 20:10 | ||
компилятор гарантирует только корректность работы с автоматическими типами То что ты говоришь что это не всегда, выглядит как-то странно, потому что такое поведение скорее случайность |
| Автор: БелАмор 15.9.2012, 20:20 | ||||||||
Я привёл пример для того, чтобы показать, что есть как минимум одно исключение. А если есть одно исключение, то общее правило перестаёт быть общим. Поэтому, независимо от того, что там реально возвращает функция при неприсвоенном результате, всегда следует считать, что она возвращает мусор.
Прошу извинить меня за занудство, но лично для меня разница между "не стоит" и "категорически нельзя" является принципиальной.
Дело не только в том, что нужно, чтобы было понятно, что функция безрезультатна. Нужно ещё: 1. Исключить в принципе потенциальную возможность где-то потом нарваться на мусор в результате. 2. Убрать предупреждение компилятора, которое захлямляет окно сообщений. При большом количестве предупреждений смысл предупреждений практически теряется, поскольку обнаружить одно новое сообщение среди десятков других становится практически нереально, и уже нет никакой разницы включены у вас предупреждения, или отключены совсем.
Про юникодные версии я пока воздержусь высказывать мнение, но на неюникодных до сих пор удавалось придерживаться правила "ни одного предупреждения при компиляции". Поставить else в том-же case, даже если других вариантов тут не может быть, меня пока не особо напрягало. А предупреждения иногда указывают на действительно серьёзные упущения. И было бы хорошо не потерять такие предупреждения в горах мусора. |
| Автор: Poseidon 16.9.2012, 03:00 | ||||
Блин. почему мне с такой случайностью не везет в лотерее?
Хотя я еще раз повторюсь, что это все не правильно |
| Автор: bems 16.9.2012, 04:47 | ||
| Poseidon, не надо блинов. с каких пор -1 это "значение по умолчанию для указанного типа"? это мусор со стека (окей, компилятор может выкинуть переменную на стеке и заменить регистром, но сути дела это не меняет). И другим он будет если переменная Result будет попадать на другое место на стеке, или то же место будет содержать другой мусор. Нет причин ожидать там мифическое "значение по умолчанию" у меня твой пример показывает не -1 а 0, а если поменять вызовы ShowMessage местами то 3211600 для автоматических типов компилятор следит за значениями по умолчанию переменной Result. Это необходимо потому что если вместо строки туда попадет мусор со стека, то ты уже не сможешь присвоить туда что-то своё (потому что для этого нужно уменьшить счетчик ссылок на старую строку, а она - мусор). но при этом не гарантируется что там пустая строка. гарантируется только что там корректное строковое значение. Но какое именно - опять случайность. Модифицируй свой пример, и посмотри что получится
|
| Автор: БелАмор 16.9.2012, 07:00 | ||||||
А у меня вот этот код:
Всегда выдаёт:
Причём, что самое смешное, это - документированное поведение. На всякий случай повторю ссылку: http://delphikingdom.com/asp/viewitem.asp?catalogid=1435 Но использовать такие особенности - это уже даже не г-код... И рассчитывать, что кто-то, кто будет просматривать такой код потом, разберётся в таких фортелях, крайне недальновидно... |
| Автор: БелАмор 16.9.2012, 07:31 | ||||
Хотел написать так:
Но результат одинаков, не стал исправлять. Если кто пойдёт по ссылке - там внизу ещё ссылка на обсуждение. |
| Автор: БелАмор 16.9.2012, 11:34 |
| Что-то я прозевал сообщение от bems и практически повторил приведённый им код... |
| Автор: bems 16.9.2012, 14:43 |
не одинаков, кстати |
| Автор: БелАмор 16.9.2012, 15:38 |
Под результатом я понимал выдаваемое сообщение. Оно одинаково. Возможно, вы не обратили внимание на то, что у меня другой вариант StrFunc. |
| Автор: bems 16.9.2012, 16:07 |
| да, не обратил, извиняюсь |
| Автор: northener 17.9.2012, 00:55 |
Хороший вопрос! Ответ может быть только один. Никогда не играйте ни в какую лотерею! Помните, что выигрыш всегда гарантирован только устроителям сей лотереи. А всем прочим (в массе своей) гарантирован проигрыш! А по сути вопроса автора согласен с высказываниями БелАмор от 15.9.2012, 16:35 P.S. Простите. До сих пор не научился давать в своём ответе ссылку на конкретный ответ в теме/ветке. Если кто может что подсказать, то прошу сообщить в личку. |