перебор списка, каждый элемент состоит из структуры внутри структуры, трудности с получением значений - PullRequest
0 голосов
/ 26 октября 2010

У меня есть список, который содержит несколько структур _MEMORY_BASIC_INFORMATION, вложенных в структуры mb (определения приведены ниже). У меня проблемы с получением информации из вложенной _MEMORY_BASIC_INFORMATION. Я использую итератор для обхода списка. Снизу я знаю, что ошибка g-> mbi; но я не знаю, как мне ссылаться на вложенную структуру ... Спасибо.

Обычно я пытаюсь записать базовый адрес из gMemList [i] в ​​start = (DWORD) g.mbi.BaseAddress; но я получаю ошибку c2228: слева от '.mbi' должен быть класс / структура / объединение.

list<struct mb *> gMemList

std::list<mb *>::iterator i = gMemList.begin();
while(i != gMemList.end())
{
    struct mb *g = *i;
    MEMORY_BASIC_INFORMATION mbi2 = g->mbi;
    start = (DWORD)mbi2.BaseAddress;
    buf = new wchar_t[255];
        while(start < mbi2.RegionSize)
    {...

//struct mb
//{
//  MEMORY_BASIC_INFORMATION mbi;
//  char *p;
//};

/*typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;*/

Ответы [ 4 ]

1 голос
/ 26 октября 2010

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

На первый взгляд я не понимаю, почему ваш код не компилируется. Однако вы должны знать, что ваше назначение mbi2 создает копию всей структуры _MEMORY_BASIC_INFORMATION. (И, возможно, в этом причина проблемы.) Вам, вероятно, не нужно копировать структуру, если я правильно понимаю ваш случай, поскольку вы хотите получить только некоторую информацию из нее.

Попробуйте это:

_MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;

Если вам не нужно ничего менять в mbi2, вам обязательно следует использовать ссылку на констант:

const _MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;

Всегда помни, что const -корректность - твой друг!

0 голосов
/ 26 октября 2010

Я думаю, проблема в том, что вы используете слово struct.В c ++ есть небольшая разница между struct и class.
Так что, просто для смеха измените все экземпляры слова struct на class.

Проблема становится более очевидной, когда вы это делаете.У вас нет объекта "g", у вас есть структура g.(PS BAD NAMING)

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

Вопрос для интервью: В чем разница между классом и объектом?

0 голосов
/ 26 октября 2010

g - указатель, вы правильно поняли:

MEMORY_BASIC_INFORMATION mbi2 = g->mbi;

Зачем ты это делаешь?:

start = (DWORD)g.mbi.BaseAddress;

разыменование g или используйте mbi2, который вы уже объявили.

0 голосов
/ 26 октября 2010

Может быть, это то, что вы ищете:

while(start < (char*)(g->mbi.BaseAddress) + mbi2.RegionSize)
{
  ...
  start++;
}

Может быть DWORD * вместо char *, я не знаю, что означает RegionSize.

Кстати, переменная начала должна быть DWORD *, а не DWORD. Или символ *, информации не так много.

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