C - “warning:format”%c“需要类型为”char *“的参数,但参数3的类型为”int“:?

时间:2013-11-14 19:50:35

标签: c pointers struct pixel ppm

我正在编写代码来将PPM文件读入包含3个无符号字符r,g和b的struct pixel_type数组中。导致问题的代码如下所示:

struct pixel_type pArray[width][height], *pPtr[width][height];
pPtr[width][height] = &pArray[width][height];

for(h = 0; h < height; h++)
{
    for(w = 0; w < width; w++)
    {
        fscanf(in, "%c%c%c", pPtr[w][h]->r, pPtr[w][h]->g, pPtr[w][h]->b);
    }
}

编译时,我收到所有3“%c”的消息:

警告:

format â%câ expects argument of type âchar *â, but argument (3,4, or 5) has type âintâ [-Wformat]

将像素值读入struct pixel_type数组的最佳方法是什么?

struct pixel_type
{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

3 个答案:

答案 0 :(得分:1)

您只需要一个临时指针,而不是整个数组。

struct pixel_type {
    unsigned char r;
    unsigned char g;
    unsigned char b;
    };

main()
{   
    struct pixel_type pArray[10][10], *pPtr;
    int height = 10, width = 10, h, w;
    char buf[32];

    /* testing */

    strcpy(buf, "abc");

    for(h = 0; h < height; h++) {
        for (w = 0; w < width; w++) {
            pPtr = &pArray[width][height];
            /* testing */
            sscanf(buf, "%c%c%c", &pPtr->r, &pPtr->g, &pPtr->b);
            /* fscanf(in, "%c%c%c", &pPtr->r, &pPtr->g, &pPtr->b); */
        }
    }
}

答案 1 :(得分:0)

您不需要声明指向数组*pPtr[width][height]的指针,因为pArray[width][height]已经是一个数组而且:

pArray[0][0];

相当于:

*pArray;

以同样的方式:

&pArray[0][0];

等同于:

pArray;

所以你只需要在指针或数组已经被引用之后指出数据所在的地址(在结构内部)。

struct pixel_type pArray[width][height];

for(h = 0; h < height; h++)
{
    for(w = 0; w < width; w++)
    {
        fscanf(in, "%c%c%c", &(pArray[w][h].r), &(pArray[w][h].g), &(pArray[w][h].b));
    }
}

答案 2 :(得分:0)

将指针pPtr[width][height]的2D数组更改为指针pPtr将解决您的问题。