си-синтаксис
От: Daedalus Гондурас http://www.rikt.ru/~daedal
Дата: 22.12.02 14:54
Оценка:
вот при конвертации в дельфи проблема появилась — хелп плиз!
имеется структура

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] ?
эт жеж не массив а запись, я уже башку сломал ? Э:/
Re: си-синтаксис
От: comer США http://getboost.codeplex.com/
Дата: 22.12.02 16:19
Оценка: 2 (1)
Здравствуйте, 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. Добавляй раскраску к коду, а то модераторы ругаться будут, и читать не очень привычно.
getboost.codeplex.com
citylizard.codeplex.com
Re[2]: си-синтаксис
От: Daedalus Гондурас http://www.rikt.ru/~daedal
Дата: 22.12.02 18:40
Оценка:
понял, пасиба!
я вобщем-то паскалист-дельфист.
и на си маленько пописываю.
а тут вот первый раз столкнулся с таким и малехо зациклился.
в msdn описание таких тонкостей не нашел, а кернигана-ричи под рукой нет.
и еще вот такой момент :
/* m_pMemStruct - указатель на структуру */
TPageStruct* pPages = (TPageStruct*)(m_pMemStruct + 1);

я так понимаю что pPages теперь должен на область сразу после m_pMemStruct?
или на второй байт этой структуры?
Re[3]: си-синтаксис
От: comer США http://getboost.codeplex.com/
Дата: 22.12.02 19:33
Оценка: 3 (1)
Здравствуйте, 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.
getboost.codeplex.com
citylizard.codeplex.com
Re[4]: си-синтаксис
От: Daedalus Гондурас http://www.rikt.ru/~daedal
Дата: 23.12.02 00:43
Оценка:
еще раз большое спасибо!
очень помогли!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.