вот при конвертации в дельфи проблема появилась — хелп плиз!
имеется структура
—
typedef struct _PageStruct
{
DWORD dwSize;
DWORD dwPhysical;
} TPageStruct, * PPageStruct;
—
внутри процедурки создается таковая pPages
—
TPageStruct* pPages = (TPageStruct*)(m_pMemStruct + 1);
—
и вдруг в цикле по i-той переменной появляется такое чудо :
—
i = 0;
while (i < m_pMemStruct->dwPages)
{
if (sum + pPages[i].dwSize > (unsigned)Offset)
{
Offset -= sum;
pRetVal = pPages[i].dwPhysical + Offset;
if ( pdwSizeAvailable != NULL )
{
*pdwSizeAvailable = pPages[i].dwSize - Offset;
}
break;
}
sum += pPages[i].dwSize;
i++;
}
—
сишный компилятор это дело сжирает безо всяких.
что могет быть здесь иметься ввиду под
pPages[i] ?
эт жеж не массив а запись, я уже башку сломал ? Э:/
Здравствуйте, Daedalus, Вы писали:
D>вот при конвертации в дельфи проблема появилась — хелп плиз!
D>имеется структура
D>typedef struct _PageStruct
D>{
D> DWORD dwSize;
D> DWORD dwPhysical;
D>} TPageStruct, * PPageStruct;
Совет, не плоди лишних монстров, типа PPagesStruct. Пользуйся *TPageStruct, и народу понятней будет.
А если у тебя C++, и ты не собираешься переводить это на C, то вообще достаточно будет
strcut TPageStrcut
{
DWORD dwSize;
DWORD dwPhysical;
};
D>внутри процедурки создается таковая pPages
D>TPageStruct* pPages = (TPageStruct*)(m_pMemStruct + 1);
D>и вдруг в цикле по i-той переменной появляется такое чудо :
D>i = 0;
D>while (i < m_pMemStruct->dwPages)
D>{
D> if (sum + pPages[i].dwSize > (unsigned)Offset)
D> {
D> Offset -= sum;
D> pRetVal = pPages[i].dwPhysical + Offset;
D> if ( pdwSizeAvailable != NULL )
D> {
D> *pdwSizeAvailable = pPages[i].dwSize - Offset;
D> }
D> break;
D> }
D>sum += pPages[i].dwSize;
D>i++;
D>}
D>сишный компилятор это дело сжирает безо всяких.
D>что могет быть здесь иметься ввиду под pPages[i] ?
D>эт жеж не массив а запись, я уже башку сломал ? Э:/
pPages[i] это тоже самое что *(pPages+i). Т.е. адрес (находящийся в pPages) смещаеться на i*sizeof(TPageStruct).
В С/С++ указатель на один элемент можно интерпритировать как указатель на массив элементов, при этом:
*pPages == *(pPages+0) == pPages[0].
А вообще, в любой книжке по C или C++ об этом обычно очень подробно написано, чуть ли не на первых страницах, причем гораздо лучше чем я тебе попытался объяснить.
P.S. Добавляй раскраску к коду, а то модераторы ругаться будут, и читать не очень привычно.
понял, пасиба!
я вобщем-то паскалист-дельфист.
и на си маленько пописываю.
а тут вот первый раз столкнулся с таким и малехо зациклился.
в msdn описание таких тонкостей не нашел, а кернигана-ричи под рукой нет.
и еще вот такой момент :
/* m_pMemStruct - указатель на структуру */
TPageStruct* pPages = (TPageStruct*)(m_pMemStruct + 1);
я так понимаю что pPages теперь должен на область сразу после m_pMemStruct?
или на второй байт этой структуры?
Здравствуйте, Daedalus, Вы писали:
D>/* m_pMemStruct - указатель на структуру */
D>TPageStruct* pPages = (TPageStruct*)(m_pMemStruct + 1);
D>я так понимаю что pPages теперь должен на область сразу после m_pMemStruct?
Завист от того на объект какого типа указывает m_pMemStruct.
То же самое что и в предыдущем случае, к адресу m_pMemStruct прибавляеться sizeof(T) (умноженное на единицу

), где T это T *m_pMemStruct.
m_pMemStruct+1 == &(m_pMemStruct[1]) == &m_pMemStruct[1]
D>или на второй байт этой структуры?
Только в том случае, если у тебя sizeof(T)==1.