Ссылка на cJson

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение 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
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылка на cJson

Сообщение Дед Пахом »

Ссылка не обнуляется, она всегда NULL. То есть j &= json.Parse(...) не меняет значение json. Это умом не понять, можно только верить.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение Admin »

Дед Пахом писал(а): 06 Сентябрь 2022, 13:38 j &= json.Parse(...)
Я тут конечно же немного ошибся. Должно быть написано
j &= jf.Parse(...)
Но в общем непонятно. С обычным классом же такое работает, вернуть в ссылку класс.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылка на cJson

Сообщение Дед Пахом »

Если передавать null-ссылку, то с любым классом не будет работать. Специально проверил для

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

TTestClass                    CLASS, TYPE
x                               LONG
                              END
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение 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)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение 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) ! тут падает
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение 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)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение Admin »

Вопрос наверное закрыт...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Ссылка на cJson

Сообщение Губин Игорь »

Admin писал(а): 07 Сентябрь 2022, 14:54 Вопрос наверное закрыт...
Дело в том, что Clarion очень своеобразно инициирует классы. Не удивлюсь, если при вызове GetData уже происходит какая-то инициация.
У меня было что-то похожее, когда пытался сделать класс thread, объявив его в APPFrame. Выяснилось, что конструктор вызывается уже в головном модуле с какими-то странными действиями.

У тебя есть передача адреса класса до New. Возможно, именно здесь и собака зарылась
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на cJson

Сообщение Admin »

Губин Игорь писал(а): 08 Сентябрь 2022, 21:21 Дело в том, что Clarion очень своеобразно инициирует классы.
Это мягко говоря. После вызова GetClass(class) => class &= GetClassRef()
ADDRESS(class) = 0
Но! При этом можно вызвать метод класса, типа class.Run('что то там')
Губин Игорь писал(а): 08 Сентябрь 2022, 21:21 У тебя есть передача адреса класса до New. Возможно, именно здесь и собака зарылась
Тот же C# без проблем позволяет, как (думаю) и другие языки. Ну и все таки это не адрес класса а адрес ссылки на класс.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить