Мой код, который у меня есть, достаточно большой и сложный, поэтому я не буду тратить ваше время на его чтение, но в результате вам придется сделать определенные предположения о переменных в нем.Я расскажу вам значения переменных, которые я подтвердил в отладчике, чтобы вы знали с уверенностью.Знайте, что я опустил здесь много несвязанного кода, так что вы видите не все, но я включил все, что имеет отношение.
// This is defined in a class:
char**** m_DataKeys;
// This is in a member function of the same class:
m_DataKeys = new char*** [m_iNumOfHeroes]; // m_iNumOfHeroes = 2
while ( pkvHero )
{
// iHeroNum = 0 and then 1 #define NUM_OF_ABILITIES 4
m_DataKeys[iHeroNum] = new char** [NUM_OF_ABILITIES];
for (int ability = 0; ability < NUM_OF_ABILITIES; ability++)
{
if (pkvExtraData) // only is true when iHeroNum == 1 and ability == 0
{
// iNumOfExtraData == 2
m_DataKeys[iHeroNum][ability] = new char* [iNumOfExtraData];
while ( pkvSubKey )
{
// iCurExtraDataNum increments from 0 to 2
m_DataKeys[iHeroNum][ability][iCurExtraDataNum] = new char [50];
Я поставил точку останова на строке
m_DataKeys[iHeroNum] = new char** [NUM_OF_ABILITIES];
До вызова строки и при iHeroNum == 0 массив m_DataKeys выглядит следующим образом:
m_DataKeys | 0x02072a60
pointer | 0xffeeffee
Error : expression cannot be evaluated
Что ожидается.После вызова линии она выглядит следующим образом:
m_DataKeys | 0x02072a60
pointer | 0x02496b00
pointer | 0xffeeffee
Error : expression cannot be evaluated
Кажется, что выглядит правильно.Однако, так как я установил там точку останова, я нажал на play, и он достиг ее на следующем цикле, где iHeroNum == 1 сейчас и запустил строку, а m_DataKeys выглядело так:
m_DataKeys | 0x02072a60
pointer | 0x02496b00
pointer | 0xffeeffee
Error : expression cannot be evaluated
Чтоточно так же, как и раньше!Строка не изменила массив .... Вообще!
Для пояснения, m_DataKeys - это трехмерный массив символьных указателей на символьные массивы размером 50.
Я не могувыяснить, почему это происходит, похоже, мой код правильный.Возможно ли, что сборщик мусора напортачил мне здесь?Или, может быть, новый распределитель?
Редактировать: Симптом более крупной проблемы
Позвольте мне подробнее остановиться на структуре моего кода, потому что на самом деле это просто дешевое решениебольшая проблема.
У меня уже есть структуры, как один из вас мудро предложил:
struct HeroData
{
// Lots o data here
// ...
// .
//
AbilityData* Abilities[NUM_OF_ABILITIES];
}
struct AbilityData
{
// More data here
// ...
// .
CUtlMap<char*,int> ExtraData [MAX_ABILITY_LEVELS];
}
Теперь, когда все усложнилось, и мне пришлось сделать это, DataKeys массивы указателей на массивы указателей дерьмотолько когда возникла необходимость загрузки некоторых данных в динамическую структуру, где и ключи, значения и числа данных являются полностью динамическими.Поэтому я решил использовать карту массивов символов для целочисленных значений, но единственная проблема заключается в том, что я не могу сохранить реальный массив символов на своей карте, я должен использовать символ *.Я попытался определить карту как:
CUtlMap<char[50],int> ExtraData [MAX_ABILITY_LEVELS];
Но это действительно не сработало, и мне все равно кажется странным.Итак, мне нужно было найти место, где можно вставить все эти ExtraDataKeys, и по какой-то причине я подумал, что это круто сделать так.Как я могу хранить массивы символов в таких объектах, как массивы или карты?