Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
BorizzK

Экземпляры класса, массив типа map и загрузчик Json

Смысл таков

 

1 Есть класс A хранилка с переменными и массивом типа map<PlayerBase, int>  (используется только во время работы - хранение ссылок на персов игроков  и время в минутах - для конфига не нужен)
   массив определяется с модификатором static что бы он не сохранялся в json (да и не нужно его сохранять) - Ибо при загрузке будет ошибка, тк загрузчик json может работать с подобными массивами если они содержат данные типа string, int и bool (да же float не может)

2 Есть внешний массив R типа этого класса в котором хранятся ссылки на экземпляры класса A

3 Есть класс B где создаются экземпляры класса A, переменным в классе A присваиваются значения и ссылки на экземпляры класса А помещаются в массив R

4 Есть класс C функция которого в последствии сохраняет все значения всех экземпляров класса А в json

5 В последствии если есть сохраненные даненные функция класса C загружает из json все данные в через массив R в содающиеся автоматом экземпляры класса А

 

Проблема следующая

Если в п 3 при создании экземпляров их инициализация проходит классически, все инициализируется как надо, с выполнением конструктора в каждом экземпляре, в каждом классе создается свой уникальный экземпляр массива map и ссылка на него помещается в соответствующую переменную, то при загрузке из json картина более чем странная:

При загрузке данных в массив R

1 Создается нужно количество экземпляров класса A и все правильно помещаются в массив R

2 Все экземпляры уникальны

3 НО! При создании экземпляров конструктор не выполняется!

4 НО! При создании экземпляров массив map  не создается - те полный игнор ref map<PlayerBase,int> R = new ref map<PlayerBase,int>;

 

подумал и перенес R = new ref map<PlayerBase,int>; в отдельную функцию Init() класса A
после загрузки из json в цикле прохожу по массиву R и из каждого экземпляра класса вызываю эту функцию R.Get(i).Init();

Все нормально, все работает, НО!
 

Экземпляр массива map создается 1 раз! в первом экземпляре класса А, во всех остальных ссылка всегд указывает на него же - те нет уникальности

Можно конечно сделать еще один класс для хранения динамических данных, но оч не хочется плодить классы

 

Вопрос в первую очередь комраду Ultima - такое поведение движка это баг или фича? Или это из-за static ?

 

Бегемоты должны быть передушены!
 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

@BorizzK ты код покажи.. так нихрена не понятно.

И статик и джсон тут не причем...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0
3 минуты назад, NoNameUltima сказал:

@BorizzK ты код покажи.. так нихрена не понятно.

И статик и джсон тут не причем...

 

Сейчас  с телепона - через часик до компа доеду скину рыбку ))

 

про static - cо static json игнорирует переменные и не сохраняет и соответственно не подгружает - те некий пртекшн от ошибки - json не со всеми типами данных работать может (если быть точнее - его сериализатор)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK при чем тут типы данных и статика? как то не так сериализуешь...

хотя в с# я б сказал вообще проблема есть с зеркалированием в класс json'а.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
14 минут назад, NoNameUltima сказал:

@BorizzK при чем тут типы данных и статика? как то не так сериализуешь...

хотя в с# я б сказал вообще проблема есть с зеркалированием в класс json'а.

 

Ты не верно понял о чем я
Сейчас доеду до компа

кину код

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вот смотри
это просто экзампл - тест

variant 1


запуск все инитится как надо

Ну и сохраняется в джосон

 

Второй запуск

Ничего не прогружается

ошибка JSON которая не крашит серв

функция вертает фалс тк загрузки не произошло

конфигурение и новое сохранение

наверное можно убрать оба мапа из json руками

но чет как-то то же не красиво

 

SCRIPT       : ::: SERVER: [GroupsClass]: Init:
SCRIPT       : ::: SERVER: [GroupsClass]: GroupsInit(): BEGIN.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.
SCRIPT    (E): JSON ERROR $CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//init.c:88
SCRIPT    (E): 
JSON ERROR:
Reading variable: data
Expecting array
At index 0, Expecting instance
Reading variable: playersInGroup
Expecting map
Map's key type can be only int, string and enum
Function: 'Error'
Stack trace:
scripts/1_Core/proto\endebug.c:44
scripts/3_Game/tools\jsonfileloader.c:29
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:192
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:94
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:70
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:57
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//init.c:88
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Config file: $profile:GroupsServerConfig.json, groups loading error!
SCRIPT       : ::: SERVER: [GroupsClass]: ConfigureGroups():
SCRIPT       : ::: SERVER: [Group]: Constructor.
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [Group]: Constructor.
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [GroupsClass]: ConfigureGroups(): END.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: SaveConfig: $profile:GroupsServerConfig.json
SCRIPT       : ::: SERVER: [GroupsServerConfig]: SaveConfig: $profile:GroupsServerConfig.json - Ok
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<5d121310>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 00000000000000000
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 11111111111111111
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict0
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict1
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = map<PlayerBase,int><6d88890>
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = map<PlayerBase,int><6d888e0>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<5d12d010>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 22222222222222222
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 33333333333333333
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict3
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = map<PlayerBase,int><6d889d0>
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = map<PlayerBase,int><6d88a20>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: Init end.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.

 

variant 2

оба map модифицированы static'ом  - json такие переменные не сериализирует и игнорирует что нам и надо

 

однако смотрим лог - мапы NULL  и конструктор не выполнился
 

SCRIPT       : ::: SERVER: [GroupsClass]: Init:
SCRIPT       : ::: SERVER: [GroupsClass]: GroupsInit(): BEGIN.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Config file: $profile:GroupsServerConfig.json loaded successfully, groups count: 2
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<617871e0>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 00000000000000000
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 11111111111111111
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict0
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict1
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = NULL
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = NULL
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<61787420>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 22222222222222222
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 33333333333333333
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict3
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = NULL
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = NULL
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: Init end.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.

Инит там пустой

variant 3 попытка проинитить мапы в Int() экземпляра класса

Да вот беда - они не уникальны и те ссылаются на один и тот же массив

 

SCRIPT       : ::: SERVER: [GroupsClass]: Init:
SCRIPT       : ::: SERVER: [GroupsClass]: GroupsInit(): BEGIN.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Config file: $profile:GroupsServerConfig.json loaded successfully, groups count: 2
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [Group]: Init.
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<dc657470>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 1
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 00000000000000000
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 11111111111111111
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict0
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict1
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = map<PlayerBase,int><65749f0>
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = map<PlayerBase,int><6574950>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: GroupDebug:Group<dc659630>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_Name                = LOST2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GropupId            = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_IsMultiGroup        = false
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs.Count()        = 2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[0]      = 22222222222222222
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_UIDs[1]      = 33333333333333333
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[0] = Restrict2
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.m_GroupsLinks[1] = Restrict3
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInBuffer       = map<PlayerBase,int><65749f0>
SCRIPT       : ::: SERVER: [GroupsClass]: : m_group.playersInGroup        = map<PlayerBase,int><6574950>
SCRIPT       : ::: SERVER: [GroupsClass]: +---------------------------------------------------------------------------------------------------------------------------------------------------+
SCRIPT       : ::: SERVER: [GroupsClass]: Init end.
SCRIPT       : ::: SERVER: [GroupsServerConfig]: Init.

Убрал static

Убрал мапы вручную из джосона - пофиг - он класс подгрузил и увидел там мапы и пытается их прогрузить - но увы - нешмогла
 

JSON ERROR:
Reading variable: data
Expecting array
At index 0, Expecting instance
Reading variable: playersInGroup
Expecting map
Map's key type can be only int, string and enum
Function: 'Error'
Stack trace:
scripts/1_Core/proto\endebug.c:44
scripts/3_Game/tools\jsonfileloader.c:29
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:194
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:96
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:72
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//Groups//GroupsClass.c:59
$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//init.c:88

И что с этим делать?

 

С мультимап кстати та же керня

P.S. С мапами есть еще и другой прикол - рассортировка

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK Ты код сократи до минимуму, и приложи свой JSON файл. т.е. оставь в классе только то, что не срабатывает.

Раз ты говоришь, что у тебя именно не грузится JSON, то удали все лишнее в классе, и выложи сюда - сам файл JSON, и как ты его грузишь и куда.

Ото кода много.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ну ты у себя подключи - увидишь

он map прогрузить не может

в ошибке написано почему

 

джосон создается если его нет
если есть прогружается

или не прогружается если в него мапы записались

 

а если мапы static' ом закрыть все норм
но во всех экземплярах map'ы неуникальны (ссылаются на одну и ту же область памяти)
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 минуты назад, BorizzK сказал:

но во всех экземплярах map'ы неуникальны (ссылаются на одну и ту же область памяти)

Я вот припоминаю такое дело)

Был такой у меня косяк, давно давно, почему я и забил на дайзовский json - по логам он клал то что надо в массив, но при попытке получить выдавал одно и тоже -то что было в нулевом элементе массива.

 

P.S. Всеж таки сократи код до самого минимума(и не надо даже создания JSON), оставь только загрузку, класс в который зеркалится json, и все. - и посмотрим.

 

Хотя там даже не в этом был 3.14здец, а в том, что при ПЕРВОМ обращении к массиву, он выдавал ПРАВИЛЬНЫЙ  результат!

т.е. запросили десятый элемент - он с него данные выдал, тут же повторно с него запросили данные, и вот тут псдц - он показывает то, что в нулевом элементе.

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Подгружать map нереально

 

интерисует другое

как закрыть переменную от сохранения в джсон (от сериализации)

 

ха

я кажется допер )))

 

Ща проверю отпишусь

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK я тебе еще раз говорю. Создай 1 файл для того чтоб его можно было тупо пихнуть в init.c того же оффлайн клиента, или на крайняк сервера.

вырежи абсолютно все из него. Оставь только загрузку JSON, и зеркало в класс и массив.

И посмотрим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
8 часов назад, NoNameUltima сказал:

@BorizzK я тебе еще раз говорю. Создай 1 файл для того чтоб его можно было тупо пихнуть в init.c того же оффлайн клиента, или на крайняк сервера.

вырежи абсолютно все из него. Оставь только загрузку JSON, и зеркало в класс и массив.

И посмотрим.

Ну так там и есть 1 файл (просто 3 разных варианта)

Инклюдишь и он заводится

Ну и как бы там есть именно то что ты написал

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вобщем изучил подробно

Поэксперементировал

Map'ы сохраняемые json не могут содержать ссылок на обьекты (у меня там PlayerBase), а могут содержать ток 3 типа, int, bool  и string

 

static не подходит для сокрытия

Оно для всех экземпляров будет одинаковым

 

Это для одного экземпляра класса хорошо

 

Пока сделал внешний массив

 

Думаю, как в классе переменную от json сериализатора скрыть...

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK Так это было изначально понятно, что ты куда то пихаешь в сохранение класс игрока...

Но ты то говорил что дело не в этом. А в загрузке.

В общем выше уже написал все - надо будет, обрежешь все лишнее и посмотрим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

А что там лишнего

Сейчас работу доработаю и сделаю совсем просто

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK Да дохрена чего.

Чтобы нормально оттестить код, нужен рабочий пример ЗАГРУЗКИ и только ее, + сам JSON файл, и все это как можно короче. - Строк 10 думаю.

Тогда можно будет быстро и корректно определить что там происходит при загрузке в статический массив, и что нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Что уложить в 10 строк?

все?

мне не нужно в самом классе что-то грузить

мне нужно грузить из одного класса

в экземпляры другого класса, указатели на которые в массиве

это значительно больше 10 строк

 

Я сейчас попробую значительно упростить

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вот собственно

Класс

Массив для экземпляров

Загрузчик

Json предварительно выгруженный

Понятно что map он загрузить не сможет да и не нужно это
но и экземпляры классов норм не инитятся

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK Ох какты много пишешь лишнего......

Вот тебе пример с твоего класса

*!!!!

1. Удалить в map PlayerBase т.к. не дано там такое содержать, да и в JSON ты это не запихаешь.

2. В примере ниже, некорректно хранится UID - как int(вообще то UID это string, но даже если его брать числом, то это - LongInt но такого типа данных в дайзе нет, так что храни как string)

 

ref array<ref MyGroup> MyGroups = new array<ref MyGroup>;

class MyGroup
{
			string				m_Name				=	"";
			int					m_GropupId			=	0;
	autoptr map<string, int> 	m_playersInBuffer	=	new map<string, int>();
	
	void MyGroup( int m_Id )
	{
		Print("MyGroup");
		m_GropupId	=	m_Id;
	}
}

class GroupsServerConfig
{
	void GroupsServerConfig()
	{
		Print("GroupsServerConfig");
		JsonFileLoader<array<ref MyGroup>>.JsonLoadFile( "$profile:GroupsServerConfig.json", MyGroups );	
		Print( string.Format( "MyGroups LOADED. Count: %1", MyGroups.Count() ) );
		
		Print( string.Format( "UID: %1", MyGroups[0].m_playersInBuffer.Get("UID") ) );
	}
}
  
void main()
{
  new GroupsServerConfig();
  .......ТУТ ДАЛЬШЕ ЧТО ХОЧЕШЬ ДЕЛАЙ.

JSON:

[ 
	{
		"m_Name": "LOST1",
		"m_GropupId": 1,
		"m_playersInBuffer": { "UID":78348 }
	}
]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@BorizzK Вообще не понятно, нахера тебе эта канитель с map хуеп и т.п.

достаточно хранить ID группы(хотя я хз, что это такое и зачем оно, - если у тебя в группе есть лидер. Если есть лидер - то хранить надо его UID, а не какой то абстрактный ID. Если его нет, и группы независимые, т.е. пол факту и не группы вовсе, а френд лист, то надо скриптом при прогрузке учитывать и заполнять перекрестные ссылки на френдов.

 

Если всеж таки лидер есть, то достаточно хранить всего лишь

string m_LeaderUID;

string m_PlayerUID;

 

т.е. для каждого игрока, запись в JSON - лидер+сам ид игрока. и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ид группы нужен

Уиды в группе отдельный массив я их там убрал

Тыж просил вырезать все

Map для динамики в нем обьект игрока для прямых манипуляций и время включения в группу

В итоге map вынес в отдельный класс

И норм

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
20 часов назад, BorizzK сказал:

Ид группы нужен

Уиды в группе отдельный массив я их там убрал

Тыж просил вырезать все

Map для динамики в нем обьект игрока для прямых манипуляций и время включения в группу

В итоге map вынес в отдельный класс

И норм

 

Всё ещё не ясно. А как ты смотришь на подход ООП (Объектно ориентированного программирования)?

Но да х с етим, смотри, что ты ломешь себе мозг?

1. ref - это статический массив, т.е. для расширения или уменьшения его тебе требуется переинициальзация! Юзай autoptr!
2. ref map<PlayerBase, int>     playersInBuffer = new ref map<PlayerBase, int>; -> Быдлокод! ненадо так!
Мой варик рещения: autoptr map<PlayerBase, int>     playersInBufferl;
void Group(int m_Id)
{

playersInBuffer = new autoptr map<PlayerBase, int>;
}

Теперь о конструкторх и деструкторах!

Если ты создаёшь один конструтор (не дефолтный), то он будет выполнен после дефолтного. Что ето значит:

1. Выделение памятию
2. инициальзация класса и помещение его в область памяти
3. Вызыв конструктора void SomeClass()
4. Вызов из программного кода иного конструтора (типа void SomeClass(int SizeOfDi))
5. Инициализация окончена.

По этому структуры данных должны быть инициализированы в конструкторе и уничтожены в деструкторе,

В процессе работы проверяй доступность (состоятельность объекта):
if (playersInBuffer)

{
SOME_ACTION
}
else
{
//ТУТ ГРУЗИМ В НОВЬ ДАННЫЕ
}
или
if (playersInBuffer != NULL)
{
SOME_ACTION
}
else
{
//ТУТ ГРУЗИМ В НОВЬ ДАННЫЕ
}

Этим ты можешь обойти проблемы с нулевыми типами и т.д.

Изменено пользователем griha41 (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, griha41 сказал:

Всё ещё не ясно. А как ты смотришь на подход ООП (Объектно ориентированного программирования)?

Но да х с етим, смотри, что ты ломешь себе мозг?

1. ref - это статический массив, т.е. для расширения или уменьшения его тебе требуется переинициальзация! Юзай autoptr!
2. ref map<PlayerBase, int>     playersInBuffer = new ref map<PlayerBase, int>; -> Быдлокод! ненадо так!
Мой варик рещения: autoptr map<PlayerBase, int>     playersInBufferl;
void Group(int m_Id)
{

playersInBuffer = new autoptr map<PlayerBase, int>;
}

Теперь о конструкторх и деструкторах!

Если ты создаёшь один конструтор (не дефолтный), то он будет выполнен после дефолтного. Что ето значит:

1. Выделение памятию
2. инициальзация класса и помещение его в область памяти
3. Вызыв конструктора void SomeClass()
4. Вызов из программного кода иного конструтора (типа void SomeClass(int SizeOfDi))
5. Инициализация окончена.

По этому структуры данных должны быть инициализированы в конструкторе и уничтожены в деструкторе,

В процессе работы проверяй доступность (состоятельность объекта):
if (playersInBuffer)

{
SOME_ACTION
}
else
{
//ТУТ ГРУЗИМ В НОВЬ ДАННЫЕ
}
или
if (playersInBuffer != NULL)
{
SOME_ACTION
}
else
{
//ТУТ ГРУЗИМ В НОВЬ ДАННЫЕ
}

Этим ты можешь обойти проблемы с нулевыми типами и т.д.

 

Я ООП занимаюсь недавно так что сам понимаешь

Я в прошлом кроме как на обычных Си, Фортране, Паскале и Ассемблере не писал ни на чем. На этих языках писал много и очень много, для промки... ПОтому шарики за ролики... Но уже некоторые шарили из-за роликов вынул и аккуратно разложил на полках...

 

Про map в enfusion

Твой 1. - в него можно и инсертить (он увеличится) и ремувить (он уменьшится) - ref - это же просто ссылка? при чем тут статический???

ссылка на область памяти где массив

какая нафиг переинициализация? зачем? в функции локальный? да? в классе же он будет жить пока экземпляр существует или пока ты его не грохнешь через Clear или new

 

+ Имеется с ним один большооой косяк

Если его наполнить через инсерт последовательно индексами и значениями индексов - они там перемешаются

те тот что ты проинсертил первым в поcледствии может оказаться не первым в массиве а десятым

сам проверь

с другими массивами этого не заметил

 

но нам то пофиг - нам проверка наличиличия индекса коим является обьект игрока и значение по этому индексу нужно
так что я просто сделал внешний отдельный класс в нем массивы и храню это там

 

далее цитато

Теперь о конструкторх и деструкторах!

 

Я это прекрасно знаю

 

однако - если инитить класс = new myClass() выполнится его конструкто что логично

 

а мне над из джсон загрузить данные в 10  экземпляров этого класса

ссылки на которые в массиве типа этого класса

причем заранее неизвестно сколько экземпляров будет

 

я все сделал и все работает как надо

оптимизировал максимально

 

ЗЫ

void Group(int m_Id)
{

playersInBuffer = new autoptr map<PlayerBase, int>;
}


Конструктор не будет выполнен если класс инитится загрузкой JSON
Заранее создать и загнать в массив экземпляры и затем прогрузить их из джсон - хрена там
Вариант
Но мы не знаем  на скок экземпляров у нас в джсон данных
Парсить и считать? Ну его нафиг
 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
31.12.2019 в 12:34, griha41 сказал:

А как ты смотришь на подход ООП

А в чем он выражается?

31.12.2019 в 12:34, griha41 сказал:

ref - это статический массив

О как! А мы то думали это ссылка, указатель, а вон оно чо оказывается...

*. В C какбЭ ваще нет динамических массивов, чего ну никак не хотя признавать, и уперто называют динамикой обычную статику, которой длина задается изначально, и походу пьесы не меняется, зато есть list и map...

31.12.2019 в 12:34, griha41 сказал:

Быдлокод! ненадо так!

Быдлокода там нет.

autoptr там и не нужен, а нужен "умный" указатель там где надо в класс правильно отзеркалить данные из загруженного JSON'а

 

Далее, -

 

1. Ссылки на классы не хранятся в JSON(как и вообще нигде...).

Так что быдлокод - это составлять map'у для JSON запихивая туда ссылочный тип с помощью кирпичей.

Как и собсно использования Map вообще в данном случае. Вместо этого (если это РЕАЛЬНО необходимо) достаточно написать свой класс с хранимыми данными.

 

2. Init внутри класса, вставленный в конструктор, дает возможность overrid'а(перекрытия) при чем полного, а не частичного, собсно как и OnDestroy внутри деструктора.

И добавляются они почти всегда(а вернее вообще ВСЕГДА), когда предполагается возможность моддинга конструктора, с полной заменой кода,  т.к. перекрыть конструктор и деструктор с помощью override нельзя.

 

class A

{

  void A()

 {

  Init();

 }

 void Init()

{

Print("A");

}

}

 

modded class A

{

 override void Init()

{

Print("test");

}

}

 

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
31.12.2019 в 14:42, BorizzK сказал:

Конструктор не будет выполнен если класс инитится загрузкой JSON

Конструктор будет выполнен ВСЕГДА.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.