инициализация фиксированной структуры члена массива C - PullRequest
0 голосов
/ 14 мая 2018

У меня есть очень простая структура POD, содержащая член массива, показанный ниже. У меня проблемы с инициализацией элемента массива фиксированной длины memberArray со ссылочным параметром массива фиксированной длины const uint32_t(&rArrayArg)[22]. У меня не будет доступа к стандартной библиотеке в конечной целевой среде.

Инициализатор члена memberArray{*rArrayArg} копирует только первую запись из rArrayArg arg. Чтобы увидеть весь массив, мне нужно использовать memcpy или (как показано здесь) std :: copy в теле конструктора.

У меня есть другая структура POD, которая принимает двумерный массив фиксированной длины const uint32_t(&rArrayArg)[4][5], который будет использоваться для инициализации соответствующего 2-го члена, поэтому было бы предпочтительным общее решение для синтаксиса инициализации члена.

struct TestStruct {
    explicit TestStruct(
        const uint32_t(&rArrayArg)[22])
        : memberArray{*rArrayArg}
    {
        //std::copy(std::cbegin(rArrayArg), std::cend(rArrayArg), memberArray);
    }

    uint32_t memberArray[22];

    // this stream helper is only present for debugging purposes
    // in the actual target environment, I will not have access to std:: 
    friend std::ostream& operator<<(std::ostream& os, const TestStruct& rhs) {
        os << "TestStruct: ";
        for (auto next : rhs.memberArray) {
            os << next << ",";
        }
        return os;
    }
};

Следующая демонстрационная версия показывает результат передачи частично заполненного параметра фиксированного массива uint32_t fixedLenArg[22] = {1,2,3,4,5,6}; явному конструктору. Печать результатов показывает:

TestStruct: 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

так ясно, что копируется только первый параметр. Если я раскомментирую std :: copy в теле конструктора (это отладка, поскольку у меня нет доступа к std :: copy в конечной среде), я получаю следующее:

TestStruct: 1,2,3,4,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Надеюсь, я правильно понял проблему, тогда это должно сработать:

struct TestStruct {
  constexpr static size_t arraySize = 22;

  explicit TestStruct(const uint32_t(&rArrayArg)[arraySize]) : memberArray() {
    for (size_t i = 0; i < arraySize; ++i)
        memberArray[i] = rArrayArg[i];
  }

  uint32_t memberArray[arraySize];

  // this stream helper is only present for debugging purposes
  // in the actual target environment, I will not have access to std::
  friend std::ostream& operator<<(std::ostream& os, const TestStruct& rhs) {
    os << "TestStruct: ";
    for (auto next : rhs.memberArray) {
      os << next << ",";
    }
    return os;
  }
};
0 голосов
/ 14 мая 2018

Если вам разрешено использовать std::array, это становится довольно тривиально:

struct TestStruct { 
    explicit TestStruct(std::array<uint32_t, 22> const& rArrayArg)
        : memberArray{rArrayArg}
    {}

    std::array<uint32_t, 22> memberArray;

    // this stream helper is only present for debugging purposes
    // in the actual target environment, I will not have access to std:: 
    friend std::ostream& operator<<(std::ostream& os, const TestStruct& rhs) {
        os << "TestStruct: ";
        for (auto next : rhs.memberArray) {
            os << next << ",";
        }
        return os;
    }
};

Встроенный конструктор копирования для std::array выполнит всю работу, которая должна иметь место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...