在c ++

时间:2019-06-13 13:08:24

标签: c++

我需要访问数组数组中的元素。

我的代码曾经是这样的:

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());

此解决方案有效。

代码中的另一个问题导致了最后一个错误。 谢谢大家

1 个答案:

答案 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]访问子数组的元素。