2010-10-25 2 views
0

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

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

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;*/ 
+0

Можете ли вы определить «у меня проблемы»? В чем проблема? Что такое «ошибка»? – EboMike

+0

Btw, вы копируете информацию в локальную переменную. Это плохо. Вероятно, вы думаете о 'MEMORY_BASIC_INFORMATION & mbi2 = g-> mbi; '. – EboMike

+0

Синтаксически корректно. Является ли это ошибкой во время выполнения? –

ответ

1

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

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

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

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

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

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

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

0

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

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

Может быть DWORD * вместо * полукокса, я не знаю, что RegionSize стоит.

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

+0

Полностью согласен с приращением .. Но это не относится к ошибке. – baash05

0

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

MEMORY_BASIC_INFORMATION mbi2 = g->mbi; 

Почему вы тогда делаете это ?:

start = (DWORD)g.mbi.BaseAddress; 

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

+0

И сделайте mbi2 ссылкой, если у вас нет причины делать копию по-члену здесь. – EboMike

+0

Pig Pen, поэтому вместо того, чтобы быть 0x1000000, который является базовым адресом в первом элементе в списке, я получаю значение 0xffcc0000, которое является последним значением в списке. – flavour404

+0

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

0

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

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

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

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

Смежные вопросы