C++ C+中的变量赋值+;(使用libpng)不工作?
我正在编写一个纹理加载器,试图使用libpng。我目前在一个很小的部分上被难住了,这毫无意义。我试图获取图像的宽度和高度,但发现返回的值没有保存C++ C+中的变量赋值+;(使用libpng)不工作?,c++,png,variable-assignment,libpng,C++,Png,Variable Assignment,Libpng,我正在编写一个纹理加载器,试图使用libpng。我目前在一个很小的部分上被难住了,这毫无意义。我试图获取图像的宽度和高度,但发现返回的值没有保存 unsigned int width; unsigned int height; ... width = png_get_image_width(png_ptr, info_ptr); height = png_get_image_height(png_ptr, info_ptr); printf("Width: %d\nHeight: %d\n
unsigned int width;
unsigned int height;
...
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
printf("Width: %d\nHeight: %d\n\n", width, height);
printf("Width: %d\nHeight: %d\n\n", png_get_image_width(png_ptr, info_ptr), png_get_image_height(png_ptr, info_ptr));
这将返回以下内容:
Width: 0
Height: 0
Width: 1024
Height: 2048
那怎么办?这个应该起作用,但显然不行
所有相关代码的Pastbin:我认为您的问题可能在于您使用
无符号int
来存储返回类型,而实际上返回类型是png\u uint\u 32
您是否尝试过这样做:
png_uint_32 width = 0;
png_uint_32 height = 0;
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
我没有试过,但我很怀疑这就是问题所在。看起来你用错了类型<代码>宽度和高度应为
png\u uint\u 32
非无符号整数
更新:
在看到粘贴库后,它看起来像是将width
和height
作为unsigned char
传递给函数,该函数有效地隐藏了类成员width
和height
,这可能不是您想要的,特别是因为unsigned char
最多只能保存255个值,宽度和高度分别为1024和2048
只需重命名函数参数。根据您发布的代码,我可以假设TextureAtlas
类中的成员数据名称与loadAtlas
成员函数中的参数名称冲突
class TextureAtlas {
protected:
unsigned int width;
unsigned int height;
public:
TextureAtlas();
virtual ~TextureAtlas();
void loadAtlas(std::string loc, unsigned char tileWidth, unsigned char tileHeight);
};
void TextureAtlas::loadAtlas(std::string loc, unsigned char width, unsigned char height) {
...
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
printf("Width: %d\nHeight: %d\n\n", width, height);
printf("Width: %d\nHeight: %d\n\n", png_get_image_width(png_ptr, info_ptr), png_get_image_height(png_ptr, info_ptr));
...
要么重命名
unsigned int width;
unsigned int height;
或中的最后两个参数
void TextureAtlas::loadAtlas(std::string loc, unsigned char width, unsigned char height)
我假设您正在尝试设置名为
width
和height
的类成员;但是,您已经用相同名称的函数参数隐藏了这些参数。它们具有类型unsigned char
,它(几乎可以肯定)不能保存大于256的值,这就是为什么在打印它们时会看到零
您可以通过以下方式进行修复:
- 重命名参数或成员变量,使其不冲突;或
- 以
和this->width
this->height
%ud
。不确定这是否解决了问题。这没有帮助,只是给了我“Width:0d”而不是“Width:0”。此外,我尝试了有符号和无符号整数。你能提供一个简短(20行左右)完整的示例程序来演示错误吗?请看。是的,我们想看看宽度
和高度
到printf
的冒险旅程。@Katherine1,哦,我想我是说%u
。无论如何,如果这不起作用,我们需要一个SSCCE。啊@Tony刚刚打败了我!:)你需要在答案中加入更多(大部分是无用的)代码来回击他,这是一个典型的新手错误:)波浪宽度和波浪高度是不同的值。这些是图像中包含的纹理的大小,而不是图像本身的大小。我不会将这些值保存到宽度或高度。尽管。。。我看到一个命名问题,可能是这样的。请再次查看您的代码。您可以在定义中调用它们tileWidth
和tileHeight
,但实现调用它们width
和height
typedef unsigned long int png\u uint\u 32代码>唯一的区别是长的
,至少对我来说,没有长的代码也是一样的。我有点想知道为什么它不会是一个正常的int类型来产生这种行为。@chris我猜这一切都取决于所使用的平台和CPU的大小。这就是为什么使用png\u uint\u 32
而不是unsigned int
@TonyTheLion绝对是个好主意;我只是指出在这种情况下,它将如何以同样的方式对我工作。正确,这正是我在回答中所说的:)