[英]access std::array<std::array> elements in 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;
編輯 :read方法的定義是:
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());
此解決方案有效。
我在導致最后一個錯誤的代碼中遇到了另一個問題。 謝謝大家
在循環中寫入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]
訪問子數組的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.