我的C ++程序中有十六进制值的unsigned char数组:
unsigned char buff[] = {0x03, 0x35, 0x6B};
我想计算这个数组的大小,以便我可以使用这个函数在UART端口linux上发送它:
if ((count = write(file,buff,length))<0)
{
perror("FAIL to write on exit\n");
}
因为我可以看到长度是int数,buff是一个可以在程序执行期间改变大小的数组。 任何人都可以帮助我如何写它。感谢
答案 0 :(得分:5)
作为获取元素数量的选项之一,您可以使用此类模板:
template<typename T, size_t s>
size_t arrSize(T(&)[s])
{
return s;
}
然后打电话:
auto length = arrSize(buff);
这可以在代码中用于各种数组类型。
如果数组大小表示总字节大小,则可以使用sizeof(buff)
。或者正如其他人建议您可以使用std::array
,std::vector
或任何其他容器代替并编写一个这样的帮助器:
template<typename T>
size_t byteSize(const T& data)
{
typename T::value_type type;
return data.size() * sizeof(type);
}
然后获取数据的实际字节大小,您只需调用:
std::vector<unsigned char> buff{0x03, 0x35, 0x6B};
auto bSize = byteSize(buff);
答案 1 :(得分:2)
如果您使用的是C ++ 11,您可能会想到切换到
#include <array>
std::array<char, 3> buff{ {0x03, 0x35, 0x6B} };
为固定数组提供了std::vector
(包括size
&amp; data
)等界面。
使用array
可能会阻止某些常见错误,并提供<algorithm>
所涵盖的某些功能。
对write
的调用将是:
write(file,buff.data(),buf.size())
答案 2 :(得分:1)
您可以使用数组执行此操作:
size_t size = sizeof array;
用你的例子给出:
ssize_t count = write(file, buff, sizeof buff);
if (count < 0 || (size_t)count != sizeof buff) {
perror("FAIL to write on exit\n");
}
注意:我使用C语义,因为write来自lib C.
在C ++中,您可以使用模板来确保将sizeof
与数组一起使用。
template<typename T, size_t s>
size_t array_sizeof(T (&array)[s]) {
return sizeof array;
}
用你的例子给出:
ssize_t count = write(file, buff, array_sizeof(buff));
if (count < 0 || static_cast<size_t>(count) != array_sizeof(buff)) {
perror("FAIL to write on exit\n");
}
答案 3 :(得分:0)
我想计算这个数组的大小,以便我可以使用这个函数在UART端口linux上发送它......
您需要COUNTOF
宏或功能。在所有情况下,他们都很难做到。例如,使用指针时,下面显示的接受答案将无声地失败:
size_t size = sizeof array;
size_t number_element = sizeof array / sizeof *array;
Microsoft Visual Studio 2005有一个名为_countof
的内置宏或模板类。它正确处理所有情况。另请参阅MSDN上的_countof Macro文档。
在非Microsoft系统上,我相信您可以使用以下内容。它将正确处理指针(来自making COUNTOF suck less):
template <typename T, size_t N>
char (&ArraySizeHelper( T (&arr)[N] ))[N];
#define COUNTOF(arr) ( sizeof(ArraySizeHelper(arr)) )
void foo(int primes[]) {
// compiler error: primes is not an array
std::cout << COUNTOF(primes) << std::endl;
}
另一个好的参考是Better array 'countof' implementation with C++ 11。它讨论了错误地执行操作的方法,以及如何在不同的编译器(如Clang,ICC,GCC和MSVC)下正确执行操作。它包括Visual Studio技巧。
buff是一个可以在程序执行期间改变大小的数组
只要您在编译时拥有数据,countof
宏或函数就可以工作。如果您正在动态构建数据,那么它可能无法正常工作。
这与密切相关:Common array length macro for C?。它甚至可能是重复的。