Напомнило.
Это значит, что при указанной нумерации строк имеет место одна из четырех комбинаций:
- Дважды срабатывает строка 6.
- Дважды срабатывает строка 13.
- Сначала срабатывает строка 6, потом 13.
- Сначала срабатывает строка 13 потом 6.
Зачем Вы сделали на два разных варианта одинаковую диагностику?
Все в процессе. Исправляю по не многу то там то сям. Сложно мне было без процедур, пока не разобрался, что ту же функцию без аргумента можно использовать как процедуру. Может и не совсем правильно, но я привык их использовать.
В C++ функция и процедура - это одно и то же. Кстати, в Паскале тоже можно функции использовать как процедуры
в смысле?
В смысле, не обращая внимание на возвращаемое значение
function afunk(arg: boolean): boolean;
.......................
// обычно так
a := afunk(true);
// но и так не возбраняется
afunk(true);
ааа…
это да, там и так можно
function afunk(arg: boolean): boolean;
.......................
// обычно так
a := aFunk(true);
// но и так не возбраняется
aFunK(true);
вот не люблю я его за это, хотя юзаю дельфю.
по началу все искал какую нибудь опцию типа case sensitive, потом успокоился
Ну вот. А я никак не привыкну, что после каждой строки нужно ставить “;”
- точку с запятой, писать if с маленькой буквы, что нужна скобка в конце а не end if, что объявляя переменную не нужно писать “Dim” Понятно, что логика она везде одна и таже, а вот синтаксис…
В С++ вовсе нет процедур – просто не такого слова. Есть функции возвращающие пустые значения
Вообще, появление столь уродливого разделения на функции и процедуры в Паскале – рудимент благостных идей структурастов – создателей этого языка. Это, кстати, весьма забавная история.
Изначально была идея создать идеальный структурный язык в котором, в частности, функции должны быть чистыми, т.е. не иметь побочных эффектов. Т.е. главная разница между процедурой и функцией проходила не по отсутствию возвращаемого значения, а по то тому факту, что функциям запрещено иметь побочные эффекты. Процедуры же - наоборот, не возвращают значений и, стало быть, обязаны иметь побочные эффекты (иначе, зачем их вызывать).
Но как это часто бывает у светлых идей идеального мира – они мало совместимы с жизнью. Например, в таком “идеальном мире” невозможно сделать функцию, которая, например, что-то выводит в файл и возвращает флаг “успешно / не успешно”. Нет, можно, конечно, сделать процедуру с параметром, передаваемом по ссылке, и вернуть результат через него, но … это ещё были “светлые идеалистические времена” и если бы тогда разработчикам Паскали сказали, что в нём в итоге будет передача по ссылке – они бы покрутили пальцем у виска и сказали бы: “только через наш труп – не для того мы создаём чистый структурный язык, чтобы тащить в него всякую дрянь с помойки”.
В результате компромиссов идеального мира с реальностью, Паскаль получился таким, каким получился: с “грязными функциями”, с передачей параметров по ссылке и даже, страшно сказать, с goto
.
Ну, а разделение на функции и процедуры осталось в таком вот недоделанном виде - “на раскоряку”. Побочные эффекты разрешены везде. Вся разница только в том, что процедуры не возвращают значений (т.е. полностью эквивалентны void
функциям в С/С++). Зато у них разный синтаксис объявления, который на кой-то хрен программисту надо знать. Напоминает анекдот: “И ради одной задницы …”. Не проще ли было оставить единый синтаксис, добавив специальный тип возвращаемого значения “ничего” (void
) и не париться?
А зачем лишние сущности?
Вот и я говорю, зачем лишний синтаксис определения процедур, отличный от синтаксиса определения функций?
Видимо, исключительно для наглядности. Сишный синтаксис с непривычки кровь из глаз вызывает ))
Чем лишняя сущность “procedure” (или “subroutine”) хуже лишней сущности “void”?
Отдельной, ни для чего более неприменимой синтаксической конструкцией, в то время как void
– всего лишь ключевое слово, используемой в качестве типа данных.
Ну нет такого типа данных!
Кстати, синтаксическая конструкция “function” тоже ни для чего более не применима. Давайте повыкидываем ВСЕ отдельные синтаксические конструкции, имеющие единственное применение.
В Вашей альтернативной вселенной может и нет, спорить не стану, а в С++ это один из фундаментальных типов данных.
ISO/IEC 14882:2020, § 6.8.2 «Fundamental types» (13)
A type cv
void
is an incomplete type that cannot be completed; such a type has an empty set of values. It is used as the return type for functions that do not return a value. Any expression can be explicitly converted to type cvvoid
. An expression of type cvvoid
shall be used only as an expression, as an operand of a comma expression, as a second or third operand of?:
, as the operand oftypeid
,noexcept
, ordecltype
, as the expression in areturn
statement for a function with the return type cvvoid
, or as the operand of an explicit conversion to type cvvoid
.
Как-то так.
Выкидывайте - не возражаю.
Так, все-таки: возвращает функция значение или не возвращает? Как можно говорить о типе того, чего вообще нет?
Спойлер
Нет, все-таки логика программистов радикально отличается от логики всех остальных людей (возможно, кроме женской).
Да это у Вас какая-то странная логика. Любой тип характеризуется множеством допустимых значений – иногда, конечным (как int
), иногда, бесконечным (как любой класс), а иногда - пустым (как void
). Что не так?
Вот скажите, почему тип с пустым множеством значений Вас удивляет настолько, что Вы готовы отказать ему в высоком звании типа, а вот, например, процессор с пустым множеством команд (ZISC – Zero Instruction Set Computer) не смущает?
А с какой стати должен смущать, если совершенно очевидно, что процессоры с нулевым (ZISC) и отрицательным (NISC) множествами команд являются всего лишь частными случаями процессоров с комплексным (CISC) множеством команд?