我正在用 C++ 开发一个应用程序,我需要知道一个变量的元素数量。我正在寻找如何做到这一点,但我无法找到解决方案。变量是这样定义的:
unsigned char *values = (unsigned char *) some_function(some_parameter);
// "some_function" takes "some_parameter" and fills "values" correctly
提前感谢您提供的任何帮助。
此致。
我正在用 C++ 开发一个应用程序,我需要知道一个变量的元素数量。我正在寻找如何做到这一点,但我无法找到解决方案。变量是这样定义的:
unsigned char *values = (unsigned char *) some_function(some_parameter);
// "some_function" takes "some_parameter" and fills "values" correctly
提前感谢您提供的任何帮助。
此致。
既然您告诉我们您正在使用哪个函数 ( FreeImage::GetBits ),我们现在知道您正在查询图像的原始数据。它的大小是图像的间距和高度的乘积,如以下公式所示:
int size = image.GetPitch() * image.GetHeight();
这是以字节char
为单位的大小,如果您访问指针,它就是元素的数量。但是在这种情况下谈论“元素的数量”(我们说的是一些低级内存,没有高级类型的比特流)有点误导,因为在阅读问题时可能会认为它是关于更高的级数组。
如果您想知道:原始图像数据通常以 size 的行排列pitch
,一个像素一个接一个,从左到右,其中每个像素的大小可能取决于某种存储格式(例如 1 字节灰度、3 字节 RGB 和 8每通道位,单色位图 1 位,以及更多格式)。
这些行从上到下(在大多数情况下)或有时从下到上(例如在 BMP 文件格式的情况下)排列。pitch
至少是图像的width
乘以每个像素的大小,因此所有像素在这样的“扫描线”中都有空间,这就是图像每行内存的调用方式。它被四舍五入到某种对齐,因此每一行都可以从整个图像的内存中对齐的地址开始。未使用的空间称为“填充”并被忽略。
根据库的不同,有时“间距”表示内存中的“每行像素”,而不是“每行字节”,但在这种情况下,它已经以字节为单位,因此您只需乘以图像高度。请注意,通常高度不会像宽度一样填充,因为这样做没有任何好处。
给定指向数组开头的指针,您永远无法确定地知道数组的长度。您必须将一些信息与数组一起传递。
该额外信息可能采用以下形式:
\0
在字符串的结尾)