Доступ к элементам std::array<std::array> в С++

Мне нужно получить доступ к элементам внутри массива массивов.

Мой код был таким:

byte var0[8]; // array of 8 bytes
byte var1[8];
byte var2[8];

c.read(100, 1000, 8, &var0); // reading 8 bytes starting from address 1000 and saving them in var0
c.read(100, 3700, 8, &var1);
c.read(100, 6400, 8, &var2);

все работало нормально, но поскольку мне нужно объявить не просто 3 массива, а 60, я хотел написать лучшую версию своего кода.

Думал написать так:

std::array<std::array<byte, 8>, 60> arr;

for(int i = 0; i < 60; i++) {
    c.read(100, 1000 + (2700 * i), 8, arr[i]); // trying to save 8 bytes inside arr[i]
}

Я думал написать массив массивов по 8 байт каждый.

Затем я заполняю их с помощью цикла for. Правильно ли писать arr[i] внутри цикла?

И как я могу получить доступ к значениям сейчас?

Раньше я писал что-то вроде этого:

std::cout << getBitAt(var0, 1, 2) << \n; // printing the 3rd bit of the 2nd byte of var0

Теперь я хочу сделать то же самое с массивом созданных мной массивов, т.е. примерно так:

std::cout << getBitAt(arr[0], 1, 2) << \n; 

РЕДАКТИРОВАТЬ: определение метода чтения:

int read(int DBNumber, int Start, int Size, void *pUsrData);

это метод из библиотеки snap7

Я попробовал решение:

for(int i = 0; i < 60; i++) {
    c.read(100, 1000 + (2700 * i), 8, arr[i].data());
}

но я получаю эту ошибку:

error: no matching function for call to ‘PLC::GetBitAt(std::array<std::array<unsigned char, 8>, 60>::value_type&, int, int)’

Итак, я попытался (не знаю, правильно ли это) использовать:

std::cout << getBitAt(arr[0].data(), 1, 2) << \n; 

но теперь я получаю сообщение об ошибке:

 error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_ostream<char>&>’

метод GetBitAt:

bool getBitAt(byte buffer[], int pos, int bit) {
  byte mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  if (bit < 0) bit = 0;
  if (bit > 7) bit = 7;
  return (buffer[pos] & mask[bit]) != 0;
}

РЕШЕНО:

c.read(100, 1000 + (2700 * i), 8, arr[i].data());

Это решение сработало.

У меня была другая проблема в коде, которая вызывала последнюю ошибку. Спасибо всем

Какое определение для функции c.read?

Neijwiert 13.06.2019 15:21
en.cppreference.com/w/cpp/контейнер/массив/данные, поэтому c.read(100, 1000 + (2700 * i), 8, arr[i].data()); и getBitAt(arr[0]->data(), 1, 2) (обратите внимание, что вы не предоставили декларацию getBitAt).
Marek R 13.06.2019 15:40

см. редактировать, пожалуйста. у меня другая ошибка

ambdere 13.06.2019 15:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
225
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is it correct to write arr[i] inside the loop?

Да, правильно писать arr[i] внутри петель. arr[i] — i-й элемент arr.

I get an error, i.e. "no known conversion for argument 1 from ‘std::array<std::array<unsigned char, 8>, 60>::value_type {aka std::array<unsigned char, 8>}’ to ‘byte* {aka unsigned char*}’"

Это означает, что read не принимает std::array в качестве аргумента. arr[i] это std::array, так что вы не можете передать это так. Вместо этого вы можете использовать arr[i].data() (или &arr[i][0], если хотите), чтобы получить указатель на данные. В отличие от обычного массива, std::array не превращается в указатель на первый элемент.

And how can I access the values now?

Вы можете получить доступ к подмассивам, используя arr[i], и к элементам подмассивов, используя arr[i][j].

arr[i] — это объект std::array, и похоже, что функция read ожидает указатель. Так что arr[i] будет неправильным.
interjay 13.06.2019 15:24

@interjay зависит от того, ожидает ли readТолько указатель или нет. Возможна перегрузка для std::array. Или это может быть шаблон. arr[i] в ​​целом не так. Нужно ли здесь что-то еще или что-то дополнительное, неизвестно.

eerorika 13.06.2019 15:25

Исходный код передал указатель на read. OP не показал своего прототипа, но нет причин предполагать, что std::array перегружен.

interjay 13.06.2019 15:26

на самом деле, если я напишу std::cout << getBitAt(arr[0], 1, 2) << \n; Я получаю сообщение об ошибке, т.е. "неизвестное преобразование для аргумента 1 из 'std::array<std::array<unsigned char, 8>, 60>::value_type {aka std::array<unsigned char, 8>}' в 'byte* {он же unsigned char*}'"

ambdere 13.06.2019 15:26
arr[i] — это (i+1)-й элемент массива
Gerardo Zinno 13.06.2019 15:53

@GerardoZinno Если arr[0] — нулевой элемент, то arr[i] — это i-й элемент

eerorika 13.06.2019 15:54

@eerorika для меня arr[0] - это первый элемент массива, но, в конце концов, я думаю, это просто способ увидеть вещи. Было бы странно говорить, что arr[1] — это первый/1-й элемент массива.

Gerardo Zinno 13.06.2019 15:56

@eeorika теперь работает! arr[i].data() работает нормально... спасибо

ambdere 13.06.2019 16:05

@GerardoZinno да, «первый», «второй» и т. д. Элемент для меня означает 0-й, 1-й и т. д. Zeroeth означает то же, что и первый.

eerorika 13.06.2019 16:08

Другие вопросы по теме