Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;无符号字符数组长度 我在C++程序中的无符号字符数组中有十六进制值: unsigned char buff[] = {0x03, 0x35, 0x6B};_C++_Linux_Uart - Fatal编程技术网

C++;无符号字符数组长度 我在C++程序中的无符号字符数组中有十六进制值: unsigned char buff[] = {0x03, 0x35, 0x6B};

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,

我想计算这个数组的大小,这样我就可以使用以下函数在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, 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::cout
buff
无法在程序执行期间更改其大小。它是用一个文本初始化的,长度始终为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;
}