Мне нужно получить доступ к элементам внутри массива массивов.
Мой код был таким:
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(100, 1000 + (2700 * i), 8, arr[i].data()); и getBitAt(arr[0]->data(), 1, 2) (обратите внимание, что вы не предоставили декларацию getBitAt).
см. редактировать, пожалуйста. у меня другая ошибка





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 зависит от того, ожидает ли readТолько указатель или нет. Возможна перегрузка для std::array. Или это может быть шаблон. arr[i] в целом не так. Нужно ли здесь что-то еще или что-то дополнительное, неизвестно.
Исходный код передал указатель на read. OP не показал своего прототипа, но нет причин предполагать, что std::array перегружен.
на самом деле, если я напишу 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*}'"
arr[i] — это (i+1)-й элемент массива
@GerardoZinno Если arr[0] — нулевой элемент, то arr[i] — это i-й элемент
@eerorika для меня arr[0] - это первый элемент массива, но, в конце концов, я думаю, это просто способ увидеть вещи. Было бы странно говорить, что arr[1] — это первый/1-й элемент массива.
@eeorika теперь работает! arr[i].data() работает нормально... спасибо
@GerardoZinno да, «первый», «второй» и т. д. Элемент для меня означает 0-й, 1-й и т. д. Zeroeth означает то же, что и первый.
Какое определение для функции
c.read?