Страница 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-ссылку, то с любым классом не будет работать. Специально проверил для

Код: Выделить всё

TTestClass                    CLASS, TYPE
x                               LONG
                              END

Ссылка на 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# без проблем позволяет, как (думаю) и другие языки. Ну и все таки это не адрес класса а адрес ссылки на класс.