На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Структура с изменяющимся размером массивов.
    Имеется структура с массивами, скажем, такая:
    ExpandedWrap disabled
      struct Ris_No_podlogka
        {
          uint16_t info[][];  
          uint16_t Color_Nabor[];
          uint8_t N_Pix_N_Color[];
        };

    Размерность массивов намеренно не определил, поскольку она может быть разная. Планирую иметь несколько файлов *.h, в которых будут находится конкретные данные в соответствии этой структурой, но разные по размерности. Эти данные нигде не подвергаются изменениям, просто используются. Далее в main.c будет находиться функция, работающая с этими данными. Если бы данные были одинакового размера, то и этой бы темы не было, а иначе мне не понятно как организовать такую работу, в основном это касается упомянутой функции, имеется ввиду передача в неё данных конкретной структуры.
      Невозможно иметь структуру неопределённого размера. Как и у любого типа данных, sizeof() структуры должен быть чётко определён. Если нужны разные структуры, это должны быть и разные типы данных. Иначе... внимание, вопрос: попробуй создать экземпляр своей структуры. Два раза, с разными размерами.
      На Cях, это может быть достигнуто динамическими массивами:
      ExpandedWrap disabled
        struct Ris_No_podlogka
        {
          uint16_t **info;
          size_t sz1info;
          size_t sz2info;
         
          uint16_t *Color_Nabor;
          size_t szColor_Nabor;
         
          uint8_t *N_Pix_N_Color;
          size_t szN_Pix_N_Color;
        };
      на Плюсах легко достигается контейнерами вроде std::vector<>, которые умеют хранить свой размер и управлять им.
      Сообщение отредактировано: Qraizer -
        Спасибо за ответ. Главное, что узнал что "Невозможно иметь структуру неопределённого размера." Остальное, что Вами изложено, с моим уровнем знания СИ, в меня не вмещается. Пока выход вижу один. В функции кейсами выбирать нужную структуру.
          Цитата Yuriy48 @
          Пока выход вижу один. В функции кейсами выбирать нужную структуру.

          Возможны варианты.
          Напрмер, используем один тип и размер структуры.
          Для этого для всех массивов назначаем максимально
          возможный размер. В структуру добавляем параметры, указывающие
          размеры используемой части массивов.
          При таком алгоритме работы можно будет легко менять размеры
          в пределах допустимого.
            Цитата Yuriy48 @
            а иначе мне не понятно как организовать такую работу

            Массивы в указатели и динамическое выделение с записью размера выделенной памяти в поле структуры.
              Цитата Qraizer @
              Невозможно иметь структуру неопределённого размера.

              Если речь про Си, то условно можно. По крайней мере с C99 (да и до того делали, но чуть иначе). Это называется flexible array member

              ExpandedWrap disabled
                struct A {
                    size_t len;
                    int data[];
                };



              Ну и дальше malloc'ом или аналогом выделяем нужную память под объект такой структуры и элементы массива

              Добавлено
              Цитата Yuriy48 @
              Пока выход вижу один. В функции кейсами выбирать нужную структуру.

              Я думаю, что это будет неудачный дизайн. Лучше использовать динамическое выделение памяти для массивов и хранить отдельно размер. Это если Си. Если плюсы, то std::vector или другой подходящий контейнер
              Сообщение отредактировано: D_KEY -
                В любом случае все сводится к хранению указателей или ссылок на другие структуры. Будь то void** или std::vector<std::variant>
                Думаю надо сначала определиться с теми данными которые предстоит хранить. А уж потом думать КАК их хранить.
                Сообщение отредактировано: sharky72 -
                  Цитата D_KEY @
                  Если речь про Си, то условно можно. По крайней мере с C99 (да и до того делали, но чуть иначе). Это называется flexible array member

                  Не очень решение. Есть куча ограничений:

                  1. Гибкий массив должен быть последним членом структуры
                  2. В структуре должен быть хотя бы один именованный член до него
                  3. Размер [] должен быть пустым - не int data[0] и не int data[1]
                  4. Нельзя создавать объекты структуры напрямую на стеке с автоматическим размером

                  На Си самый вменяемый вариант - это вариант Qraizer'а.

                  Цитата sharky72 @
                  Думаю надо сначала определиться с теми данными которые предстоит хранить. А уж потом думать КАК их хранить.

                  Вот это - золотые слова (#d4af37). Только вот слёту рекомендовать std::variant (наверное в связке с std::visit) - имхо, слишком самоуверенное решение ;) Из постановки задачи не ясно чо надо в итоге. На шаблонах имеем статический полиморфизм и скорость, на наследовании и использования виртуальных функций - имеем меньшую скорость, но большую гибкость. Например, создание плагинов без необходимости полной пересборки проекта. Ибо рантайм тоже рулид!
                    Цитата Majestio @
                    Не очень решение.

                    Да, согласен. Просто немного дополнил/поправил утверждение о невозможности.
                      Цитата D_KEY @
                      Цитата Majestio @
                      Не очень решение.

                      Да, согласен. Просто немного дополнил/поправил утверждение о невозможности.

                      Ааа ... ну так-то, да.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0392 ]   [ 16 queries used ]   [ Generated: 15.12.25, 00:42 GMT ]