Указатель на таблицу приводит к тому, что символы не загружаются - PullRequest
1 голос
/ 15 сентября 2011

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

Мой класс имеет только функцию инициализации, в которой он определяет, какую таблицу использовать, а затем устанавливает для переменных-членов соответствующие значения и устанавливает двойной указатель на первый элемент массива. У меня есть некоторые #defines, которые определяют, какой набор таблиц использовать, а затем перечисление, которое я передаю в функцию initialize, чтобы определить, какую таблицу в данном наборе использовать. Итак, моя функция инициализации выглядит так:

void CMyClass::initialize(enum mode)
{
#ifdef VERSION1
    switch (mode)
    {
        case mode1:
        m_Data = &tableVersion1Mode1[0];
        //set member variables
        break;

        case mode2:
        m_Data = &tableVersion1Mode2[0];
        //set member variables
        break;

        case mode3:
        m_Data = &tableVersion1Mode3[0];
        //set member variables
        break;
    }
#endif

#ifdef VERSION2
    switch(mode)
    {
        //same thing
    }
#endif

//etc etc
}

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

Если я установлю указатель на другую таблицу в каждом случае, как указано выше, то символы не будут загружены.

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

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

Я провел небольшое исследование по этому вопросу, и я знаю, что если символы не загружаются, это, вероятно, проблема с файлами .pdb. Я попытался вручную загрузить .pdb, и он говорит, что он не совпадает. Но если я запускаю ChkMatch.exe на исполняемом файле и .pdb, он говорит, что они совпадают. Так что же происходит?

...