C++ C+中的变量赋值+;(使用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

我正在编写一个纹理加载器,试图使用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\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

对于无符号整数IIRC,应该使用
%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绝对是个好主意;我只是指出在这种情况下,它将如何以同样的方式对我工作。正确,这正是我在回答中所说的:)