Страница 1 из 1
В дебрях синтаксиса
Добавлено: 18 Сентябрь 2021, 15:21
Игорь Столяров
Привет всем !
Долго вылавливал проблему в своём коде. И я её поймал !
Если утрировать - то проблема была в том, что вот такой код,
с точки зрения транслятора, является абсолютно корректным:
Что бы это значило ?
Нельзя сказать, что после Return код не транслируется.
В дебрях синтаксиса
Добавлено: 19 Сентябрь 2021, 17:27
kreator
В чём проблема? Оператор return не предполагает скобок. Всё то, что после return считается выражением. Другое дело - почему не ругается на отсутствие пробела. Но и это наверно фича.
В дебрях синтаксиса
Добавлено: 19 Сентябрь 2021, 21:19
Игорь Столяров
kreator писал(а): ↑19 Сентябрь 2021, 17:27
В чём проблема?
Дело не в том, что проблема. Понять бы ...
Насколько я знаю функция Return(ЗНАЧЕНИЕ) и оператор Return ЗНАЧЕНИЕ - это разное.
Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу и
поэтому не может использоваться, например, для возврата указателей (не путать с адресом).
Получается, что добавление фрагмента & '456' преобразует функцию в оператор ...
Но тогда Return(ЗНАЧЕНИЕ) и Return (ЗНАЧЕНИЕ) должны быть разными.
В дебрях синтаксиса
Добавлено: 19 Сентябрь 2021, 21:38
Дед Пахом
Игорь Столяров писал(а): ↑19 Сентябрь 2021, 21:19
Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу
Вроде как Return не функция, а statement, а возвращаемый результат преобразуют к базовому типу скобки (), по крайней мере я так справку по RETURN перевёл.
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 8:44
Игорь Столяров
Как я понимаю справку - нужно всегда использовать конструкцию
если нет каких-то особых требований.
Например передачи результата в программу на другом языке программирования.
Правильно ?
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 9:21
porutchik
если не уверен то наверно лучше RETURN (РЕЗУЛЬТАТ)
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 10:30
kreator
Игорь Столяров писал(а): ↑20 Сентябрь 2021, 8:44
Как я понимаю справку - нужно всегда использовать конструкцию
если нет каких-то особых требований.
Например передачи результата в программу на другом языке программирования.
Правильно ?
Я думаю, что лучше без скобок. Хотя шаблоны генерят вот так:
GlobalResponse = ThisWindow.Run() ! Opens the window and starts an Accept Loop
RETURN(LOC:ReturnValue)
А в libsrc и так и так. Как будто нет разницы.
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 19:18
gopstop2007
не дойдите до вражды между тупоконечниками и остроконечниками, как у Гулливера
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 20:02
Игорь Столяров
Виртуального мордобоя здесь точно не будет ...
Просто есть некоторое недопонимание происходящего.
Одно я рассказал в первом сообщении, другое заключается в том, что в справке написано:
Относительно использования скобок с RETURN, если функция имеет тип возвращаемой переменной или указателя, возвращаемая переменная использованная в операторе RETURN не должна заключаться в круглые скобки.
OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 20:33
porutchik
404 сейчас не постят - украинцы обижаются %)
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 21:52
kreator
Игорь Столяров писал(а): ↑20 Сентябрь 2021, 20:02
OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...
И работает?
В дебрях синтаксиса
Добавлено: 20 Сентябрь 2021, 22:20
Игорь Столяров
kreator писал(а): ↑20 Сентябрь 2021, 21:52И работает?
Да. Видимо указатель преобразуется к какому-нибудь базовому типу ULONG, каковым он и является ...
Другой вопрос, что будет с указателем на сложный составной тип или QUEUE (в C11), по идее должна
рушиться проверка типизации при присвоении результата функции ...
Но это же SV Clarion. Здесь и невозможное - возможно ...
В дебрях синтаксиса
Добавлено: 21 Сентябрь 2021, 11:49
kreator
Подозреваю - в справке хрень написана. Когда-то и было различие. Сейчас его нет. Ну и правильно!
В дебрях синтаксиса
Добавлено: 24 Сентябрь 2021, 11:11
Дед Пахом
Вот простой пример про скобки.
Код: Выделить всё
PROGRAM
MAP
GetLongRef(BOOL pUseBracesInReturn), *LONG
END
ThisLong LONG(100)
ThisAddress LONG, AUTO
ThisRef &LONG, AUTO
CODE
ThisAddress = ADDRESS(ThisLong)
!- return x
ThisRef &= GetLongRef(FALSE) !- ThisRef ссылается на ThisAddress
MESSAGE('RETURN x = '& ThisRef)
!- return (x)
ThisRef &= GetLongRef(TRUE) !- ThisRef ссылается на ThisLong
MESSAGE('RETURN(x) = '& ThisRef)
GetLongRef PROCEDURE(BOOL pUseBracesInReturn)
CODE
IF pUseBracesInReturn
RETURN (ThisAddress)
ELSE
RETURN ThisAddress
END