Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>К ранеесказанному добавлю ещё один кейс.
SVZ>>Индекс в массиве это полноценная сущность БД. Используется вместо указателей.
SVZ>>В этом случае отрицательные значения используются для обозначения невалидных объектов (у нас это -1) и для каких-нибудь специальных констант.
R>Если вынести за скобки вопросы стиля и дизайна, то операция индексирования применима не только к массивам, но и указателям. Ведь, согласно стандарту, операция индексирования — это просто комбирация опрация сложения указателя и числа с последующим разыменованием. *(p + i), *(i + p), p[i], i[p] — все это равнозначные выражения и индекс вполне может быть отрицательным.
Неее, тут всё гораздо интереснее. Из указателя ты много информации не вытянешь, а вот из индекса в массиве очень даже.
К примеру, у нас в структурах данных некоторые связи не хранятся явно, а вычисляются на основе индекса.
// ======================================================================
typedef int BRICK; //!< Single mesh cell
typedef std::pair<BRICK, BRICK> BRICK2; //!< Couple of bricks
typedef int FACET; //!< A facet of the cell (each cell has 6 facets)
typedef int JOINT; //!< Joint between adjacent cells
typedef unsigned char FILLING; //!< ID of the Cell filling
typedef int BRDATAEX; //!< Reference to the brick additional data
typedef int JOINTDATAEX; //!< Reference to the joint additional data
typedef int FACETREF; //!< Reference to the list of facets
typedef float PMLStretch;
typedef float PMLSigma;
typedef unsigned char JUNCTYPE; //!< Тип соединения на Joint (eJunctionFace)
typedef int UPORT; //!< Индекс Micro-port'а
typedef int UPORTVAL; //!< Значение Micro-port
typedef int CORNER; //!< Угол ячейки
// ======================================================================
enum
{
Facet_Brick = 6, // Число граней у ячейки - для SplitFace могут быть дополнительные subfacets
Corner_Brick = 8, // Число углов у ячейки
UPort_Facet = 2, // Число микропортов у одной грани или subfacet
UPort_Brick = 6*2, // Число микропортов у ячейки - только для Simple, PML, Conformal - больше для SplitFace Brick
IncFacet_Max = 4 // Макс. число инцидентных граней
// с одной стороны соединения
};
Вот и пример отрицательных индексов
enum { NONE = -1, DEAD = -2 };
Вот пример вычисляемых связей между сущностями
//! Получить первый порт, принадлежащий грани
inline UPORT Facet2UPort1(FACET f) { return f * 2; }
//! Получить второй порт, принадлежащий грани
inline UPORT Facet2UPort2(FACET f) { return f * 2 + 1; }
С указателями ты такого не сделаешь.