C++;无符号字符数组长度 我在C++程序中的无符号字符数组中有十六进制值: unsigned char buff[] = {0x03, 0x35, 0x6B};
我想计算这个数组的大小,这样我就可以使用以下函数在UART端口linux上发送它:C++;无符号字符数组长度 我在C++程序中的无符号字符数组中有十六进制值: unsigned char buff[] = {0x03, 0x35, 0x6B};,c++,linux,uart,C++,Linux,Uart,我想计算这个数组的大小,这样我就可以使用以下函数在UART端口linux上发送它: if ((count = write(file,buff,length))<0) { perror("FAIL to write on exit\n"); } 如果((count=write(file,buff,length))可以使用数组执行此操作: size_t size = sizeof array; 以您的例子,给出: ssize_t count = write(file, buff,
if ((count = write(file,buff,length))<0)
{
perror("FAIL to write on exit\n");
}
如果((count=write(file,buff,length))可以使用数组执行此操作:
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");
}
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");
}
以您的例子,给出:
ssize_t count = write(file, buff, sizeof buff);
if (count < 0 || (size_t)count != sizeof buff) {
perror("FAIL to write on exit\n");
}
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");
}
ssize\u t count=write(文件,buff,数组大小(buff));
如果(计数<0 | |静态(计数))!=阵列(增益)){
perror(“退出时写入失败”);
}
作为获取元素数量的选项之一您可以使用以下模板:
template<typename T, size_t s>
size_t arrSize(T(&)[s])
{
return s;
}
这可以在各种数组类型的代码中使用
如果数组大小是指它的总字节大小,您可以使用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);
}
模板
大小字节大小(常数和数据)
{
typename T::value\u type类型;
返回data.size()*sizeof(type);
}
然后,要获取数据的实际字节大小,只需调用:
std::vector<unsigned char> buff{0x03, 0x35, 0x6B};
auto bSize = byteSize(buff);
std::vector buff{0x03,0x35,0x6B};
自动bSize=字节大小(buff);
如果您使用的是C++11,您可能会考虑切换到
#include <array>
std::array<char, 3> buff{ {0x03, 0x35, 0x6B} };
我想计算这个数组的大小,这样我就可以使用这个函数在UART端口linux上发送它
您需要一个COUNTOF
宏或函数。在所有情况下,这些宏或函数都可能很难正确执行。例如,使用指针时,下面显示的已接受答案将自动失败:
size_t size = sizeof array;
size_t number_element = sizeof array / sizeof *array;
Microsoft Visual Studio 2005有一个名为\u countof
的内置宏或模板类。它可以正确处理所有情况。另请参阅MSDN上的文档
在非Microsoft系统上,我相信您可以使用以下内容。它将正确处理指针(从):
模板
char(&ArraySizeHelper(T(&arr)[N]))[N];
#定义COUNTOF(arr)(sizeof(ArraySizeHelper(arr)))
void foo(整数素数[]){
//编译器错误:素数不是数组
std::coutbuff
无法在程序执行期间更改其大小。它是用一个文本初始化的,长度始终为3。这些值不是十六进制的,您只使用十六进制表示法编写。{3,53,107}
完全等效,{03,065,0153}
@Story Teller这只是一个例子,buff可以存储不同数量的值。因此它是一个裸指针?无符号字符*buff
?不,它是数组。感谢您的帮助。感谢您的帮助。注意:这比sizeof array/sizeof*array
方法要好,因为如果您调用它,它将始终无法编译它包含一个运算符*
,但不是数组。另一个方法将编译并默默地给出错误的结果。@Stargateur感谢您的注释,修复了这一伟大的建议,但请注意
也适用于C样式数组。不需要输入OP,这会给出OP想要的大小(以字节为单位)的元素数。大小(以字节为单位)和大小在char的情况下是相等的。使用其他类型可以使用与大小的乘法_type@jww我很清楚地说“使用数组”。当然,对于指针,这样做没有意义!不,这不会“失败”使用指针。这会导致不同的结果。使用不同的目的。我只是根据问题的上下文回答。不回答OP,这会给出OP想要的元素数,大小以字节为单位。
size_t size = sizeof array;
size_t number_element = sizeof array / sizeof *array;
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;
}