Re[3]: Откуда эта лютая любовь к знаковым целым?
От: Stanislav V. Zudin Россия  
Дата: 05.05.20 10:31
Оценка:
Здравствуйте, 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; }


С указателями ты такого не сделаешь.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.