我需要访问数组数组中的元素。
我的代码曾经是这样的:
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());
此解决方案有效。
代码中的另一个问题导致了最后一个错误。 谢谢大家
答案 0 :(得分:4)
在循环内写入arr [i]是否正确?
是的,在循环内写入arr[i]
是正确的。 arr[i]
是arr
的第i个元素。
我收到一个错误,即“
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
不会衰减到指向第一个元素的指针。
现在如何访问这些值?
您可以使用arr[i]
访问子数组,并使用arr[i][j]
访问子数组的元素。