c ++传递包含指针的const结构 - 如何移动值?
c++ Passing a const struct that contains a pointer - how to move through the values?
typedef struct {
unsigned int width;
unsigned int height;
PBYTE pixels;
} PBYTEImage;
void someFunction(const PBYTEImage& inputImage)
{
for (unsigned int x = 0; x < inputImage.width*inputImage.height; x++)
{
unsigned char y = *(inputImage.pixels);
-> inputImage.pixels += 1;
}
}
Error: expression must be a modifiable value
我是否在修改 PBYTE 的内容?我以为 inputImage.pixels += 1;
只会将指针 PBYTE
前进到下一个值...对吗?
想要什么:
结构的内容不应被函数修改
函数应该能够读取结构,并在读取其数据时推进指针 PBYTE
我不认为我可以将 struct 中的项目设为 const,因为调用者必须分配它们的值。
最好的方法是什么?
void someFunction(const PBYTEImage* inputImage)
具有相同的效果。似乎 const 适用于不允许我修改其指针的结构,包括指针指向的值...
我必须删除 const 吗?有没有办法表明函数不修改数据?
编辑:PBYTE
是
typedef unsigned char BYTE;
typedef BYTE near *PBYTE;
在minwindef.h
或windef.h
中定义
抱歉没提
Do I have to drop the const ? Is there no way to show that the function does not modify the data ?
实际上,您的函数确实会更改参数数据,因为您正在递增 inputImage.pixels。
所以你可能想存储 inputImage.pixels 并迭代它。
void someFunction(const PBYTEImage& inputImage)
{
PBYTE pPixels = inputImage.pixels;
for (unsigned int x = 0; x < inputImage.width*inputImage*height;)
{
unsigned char y = *pPixels;
pPixels += 1;
}
}
首先,你的 for 循环的退出条件有错别字:你写了
inputImage*height
但应该是
inputImage.height
除此之外,您还没有告诉我们 PBYTE 是什么,但是从这一行开始
unsigned char y = *(inputImage.pixels);
我想你有什么地方
typedef unsigned char* PBYTE;
所以PBYTE是一个指针。表达式
inputImage.pixels += 1;
确实尝试增加指针,像素。由于 pixels 是您的结构的成员,并且您的结构作为常量传递,因此您收到了错误。所以是的,如果你想保持你的结构不变并增加指针,你必须在你的函数定义中删除 const 。从将 inputImage 作为引用传递更改为将其作为指针传递也无济于事。
Do I have to drop the const ? Is there no way to show that the
function does not modify the data ?
也许您希望从 const-ness 的角度来看是安全的,因为您只是移动指针而不是触摸它指向的数据:没错,但在这种情况下,指针本身就是您的数据,而您正在尝试更改它。所以你的函数会修改数据。
typedef struct {
unsigned int width;
unsigned int height;
PBYTE pixels;
} PBYTEImage;
void someFunction(const PBYTEImage& inputImage)
{
for (unsigned int x = 0; x < inputImage.width*inputImage.height; x++)
{
unsigned char y = *(inputImage.pixels);
-> inputImage.pixels += 1;
}
}
Error: expression must be a modifiable value
我是否在修改 PBYTE 的内容?我以为 inputImage.pixels += 1;
只会将指针 PBYTE
前进到下一个值...对吗?
想要什么:
结构的内容不应被函数修改
函数应该能够读取结构,并在读取其数据时推进指针 PBYTE
我不认为我可以将 struct 中的项目设为 const,因为调用者必须分配它们的值。
最好的方法是什么?
void someFunction(const PBYTEImage* inputImage)
具有相同的效果。似乎 const 适用于不允许我修改其指针的结构,包括指针指向的值...
我必须删除 const 吗?有没有办法表明函数不修改数据?
编辑:PBYTE
是
typedef unsigned char BYTE;
typedef BYTE near *PBYTE;
在minwindef.h
或windef.h
抱歉没提
Do I have to drop the const ? Is there no way to show that the function does not modify the data ?
实际上,您的函数确实会更改参数数据,因为您正在递增 inputImage.pixels。 所以你可能想存储 inputImage.pixels 并迭代它。
void someFunction(const PBYTEImage& inputImage)
{
PBYTE pPixels = inputImage.pixels;
for (unsigned int x = 0; x < inputImage.width*inputImage*height;)
{
unsigned char y = *pPixels;
pPixels += 1;
}
}
首先,你的 for 循环的退出条件有错别字:你写了
inputImage*height
但应该是
inputImage.height
除此之外,您还没有告诉我们 PBYTE 是什么,但是从这一行开始
unsigned char y = *(inputImage.pixels);
我想你有什么地方
typedef unsigned char* PBYTE;
所以PBYTE是一个指针。表达式
inputImage.pixels += 1;
确实尝试增加指针,像素。由于 pixels 是您的结构的成员,并且您的结构作为常量传递,因此您收到了错误。所以是的,如果你想保持你的结构不变并增加指针,你必须在你的函数定义中删除 const 。从将 inputImage 作为引用传递更改为将其作为指针传递也无济于事。
Do I have to drop the const ? Is there no way to show that the function does not modify the data ?
也许您希望从 const-ness 的角度来看是安全的,因为您只是移动指针而不是触摸它指向的数据:没错,但在这种情况下,指针本身就是您的数据,而您正在尝试更改它。所以你的函数会修改数据。