Страница 1 из 1
Ссылка на cJson
Добавлено: 06 Сентябрь 2022, 9:18
Admin
Непонятно. Почему в GetData1 ссылка обнуляется.
Код: Выделить всё
MAP
GetData1(*cJson j)
GetData2(), *cJson
END
json &cJson
CODE
GetData1(json)
! тут json NULL
...
json &= GetData2()
! тут json не NULL
GetData1 PROCEDURE(*cJson j)
jf cJSONFactory
CODE
...
j &= json.Parse(...)
! тут j не NULL
GetData2 PROCEDURE()!, *cJson
r &cJson
jf cJSONFactory
CODE
...
r &= json.Parse(...)
! тут r не NULL
RETURN r
Ссылка на cJson
Добавлено: 06 Сентябрь 2022, 13:38
Дед Пахом
Ссылка не обнуляется, она всегда NULL. То есть j &= json.Parse(...) не меняет значение json. Это умом не понять, можно только верить.
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 2:51
Admin
Дед Пахом писал(а): 06 Сентябрь 2022, 13:38
j &= json.Parse(...)
Я тут конечно же немного ошибся. Должно быть написано
j &= jf.Parse(...)
Но в общем непонятно. С обычным классом же такое работает, вернуть в ссылку класс.
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 9:54
Дед Пахом
Если передавать null-ссылку, то с любым классом не будет работать. Специально проверил для
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 14:43
Admin
Дед Пахом писал(а): 07 Сентябрь 2022, 9:54
Если передавать null-ссылку
А как тут работает, или я что то не то делаю?
Код: Выделить всё
PROGRAM
MAP
GetData(*SimpleClass inClass)
GetRef(),*SimpleClass
END
SimpleClass CLASS,TYPE
Run PROCEDURE(STRING inText)
END
SC &SimpleClass
CODE
GetData(SC)
SC.Run('Call class in ref')
GetData PROCEDURE(*SimpleClass inClass)
CODE
inClass &= GetRef()
GetRef PROCEDURE()!,*SimpleClass
loc:class &SimpleClass
CODE
loc:class &= NEW SimpleClass
RETURN loc:class
SimpleClass.Run PROCEDURE(STRING inText)
CODE
MESSAGE(inText)
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 14:51
Admin
Прикол... а вот так падает
Код: Выделить всё
PROGRAM
MAP
GetData(*SimpleClass inClass)
GetRef(),*SimpleClass
END
SimpleClass CLASS,TYPE
InnerText STRING(100)
Run PROCEDURE(STRING inText)
END
SC &SimpleClass
CODE
GetData(SC)
SC.Run('Call class in ref')
GetData PROCEDURE(*SimpleClass inClass)
CODE
inClass &= GetRef()
GetRef PROCEDURE()!,*SimpleClass
loc:class &SimpleClass
CODE
loc:class &= NEW SimpleClass
loc:class.InnerText = 'Warning'
RETURN loc:class
SimpleClass.Run PROCEDURE(STRING inText)
CODE
MESSAGE('Тут норм')
MESSAGE(inText,SELF.InnerText) ! тут падает
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 14:54
Admin
А так работает... странный Clarion
Код: Выделить всё
PROGRAM
MAP
GetRef(),*SimpleClass
END
SimpleClass CLASS,TYPE
InnerText STRING(100)
Run PROCEDURE(STRING inText)
END
SC &SimpleClass
CODE
SC &= GetRef()
SC.Run('Call class in ref')
GetRef PROCEDURE()!,*SimpleClass
loc:class &SimpleClass
CODE
loc:class &= NEW SimpleClass
loc:class.InnerText = 'Warning'
RETURN loc:class
SimpleClass.Run PROCEDURE(STRING inText)
CODE
MESSAGE(inText,SELF.InnerText)
Ссылка на cJson
Добавлено: 07 Сентябрь 2022, 14:54
Admin
Вопрос наверное закрыт...
Ссылка на cJson
Добавлено: 08 Сентябрь 2022, 21:21
Губин Игорь
Admin писал(а): 07 Сентябрь 2022, 14:54
Вопрос наверное закрыт...
Дело в том, что Clarion очень своеобразно инициирует классы. Не удивлюсь, если при вызове GetData уже происходит какая-то инициация.
У меня было что-то похожее, когда пытался сделать класс thread, объявив его в APPFrame. Выяснилось, что конструктор вызывается уже в головном модуле с какими-то странными действиями.
У тебя есть передача адреса класса до New. Возможно, именно здесь и собака зарылась
Ссылка на cJson
Добавлено: 09 Сентябрь 2022, 3:17
Admin
Губин Игорь писал(а): 08 Сентябрь 2022, 21:21
Дело в том, что Clarion очень своеобразно инициирует классы.
Это мягко говоря. После вызова GetClass(class) => class &= GetClassRef()
ADDRESS(class) = 0
Но! При этом можно вызвать метод класса, типа class.Run('что то там')
Губин Игорь писал(а): 08 Сентябрь 2022, 21:21
У тебя есть передача адреса класса до New. Возможно, именно здесь и собака зарылась
Тот же C# без проблем позволяет, как (думаю) и другие языки. Ну и все таки это не адрес класса а адрес ссылки на класс.