Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Sign in to follow this  
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 ?

 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Recommended Posts










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

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites
  • 0

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

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

 

Share this post


Link to post
Share on other sites
  • 0
14 минут назад, NoNameUltima сказал:

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

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

 

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

кину код

Share this post


Link to post
Share on other sites
  • 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. С мапами есть еще и другой прикол - рассортировка

 

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

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

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
  • 0
4 минуты назад, BorizzK сказал:

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

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

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

 

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

 

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

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

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

 

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

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

 

ха

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

 

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

 

Share this post


Link to post
Share on other sites
  • 0

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

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

И посмотрим.

Share this post


Link to post
Share on other sites
  • 0
8 часов назад, NoNameUltima сказал:

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

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

И посмотрим.

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

 

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

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

 

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

 

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

 

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

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

все?

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

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

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

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

 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Класс

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

Загрузчик

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

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

 

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

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 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 }
	}
]

 

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

string m_LeaderUID;

string m_PlayerUID;

 

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

И норм

 

Share this post


Link to post
Share on other sites
  • 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
{
//ТУТ ГРУЗИМ В НОВЬ ДАННЫЕ
}

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

Edited by griha41 (see edit history)

Share this post


Link to post
Share on other sites
  • 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
Заранее создать и загнать в массив экземпляры и затем прогрузить их из джсон - хрена там
Вариант
Но мы не знаем  на скок экземпляров у нас в джсон данных
Парсить и считать? Ну его нафиг
 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 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");

}

}

 

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0
31.12.2019 в 14:42, BorizzK сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.