Долго вылавливал проблему в своём коде. И я её поймал !
Если утрировать - то проблема была в том, что вот такой код,
с точки зрения транслятора, является абсолютно корректным:
Код: Выделить всё
Return('123') & '456'
Модератор: Дед Пахом
Код: Выделить всё
Return('123') & '456'
Дело не в том, что проблема. Понять бы ...
Вроде как Return не функция, а statement, а возвращаемый результат преобразуют к базовому типу скобки (), по крайней мере я так справку по RETURN перевёл.Игорь Столяров писал(а): ↑19 Сентябрь 2021, 21:19 Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу
Код: Выделить всё
RETURN РЕЗУЛЬТАТ
Я думаю, что лучше без скобок. Хотя шаблоны генерят вот так:Игорь Столяров писал(а): ↑20 Сентябрь 2021, 8:44 Как я понимаю справку - нужно всегда использовать конструкцию
если нет каких-то особых требований.Код: Выделить всё
RETURN РЕЗУЛЬТАТ
Например передачи результата в программу на другом языке программирования.
Правильно ?
А в libsrc и так и так. Как будто нет разницы.GlobalResponse = ThisWindow.Run() ! Opens the window and starts an Accept Loop
RETURN(LOC:ReturnValue)
OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...Относительно использования скобок с RETURN, если функция имеет тип возвращаемой переменной или указателя, возвращаемая переменная использованная в операторе RETURN не должна заключаться в круглые скобки.
И работает?Игорь Столяров писал(а): ↑20 Сентябрь 2021, 20:02 OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...
Да. Видимо указатель преобразуется к какому-нибудь базовому типу ULONG, каковым он и является ...
Код: Выделить всё
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