在C中通过引用传递结构的问题

时间:2011-04-22 12:56:53

标签: c reference struct

我试图在CProgramming论坛上回答我的问题,但是他们的数据库存在一些问题。

我有这些结构:

typedef struct QuadImageInfo *QuadImage;

typedef struct QuadImageInfo
{
    float whiteness;
    QuadImage nw, ne, sw, se;
} QuadImageInfo;

我有这些功能:

void LoadQuadImageAux(FILE *fp, QuadImage img)
{
    int pos;
    QuadImage ptr[4], loaded = NewQuadImage(0.0);
    SetPointersToQuadrants(&img, ptr);

    for(pos = 0; pos < 4; pos++)
    {
        switch(fgetc(fp))
        {
            case '0' : ptr[pos] = NewBlackQuadImage(); break;
            case '1' : ptr[pos] = NewWhiteQuadImage(); break;
            case 'Q' : LoadQuadImageAux(fp, ptr[pos] = loaded);
        }
}

QuadImage LoadQuadImage(FILE *fp)
{
    QuadImage loaded = NewQuadImage(0.0);

    switch(fgetc(fp))
    {
        case '0' : loaded = NewBlackQuadImage(); break;
        case '1' : loaded = NewWhiteQuadImage(); break;
        case 'Q' : LoadQuadImageAux(fp, loaded);
    }

    return loaded;
}

如您所见,我在QuadImage loaded中创建了LoadQuadImage,然后将其传递给LoadQuadImageAux。我的目标是访问/修改loaded的4个内部QuadImages,然后在LoadQuadImage中返回它。 有一种简单的方法,包括4次“重复”代码(每个QuadImage一个)。 我想创建一个指向这4个QuadImages的指针数组,并通过for loop中的LoadQuadImageAux访问/修改它们。 生成QuadImage pointers array的代码是:

void SetPointersToQuadrants(QuadImage *img, QuadImage *ptr)
{
    ptr[0] = (*img)->nw;
    ptr[1] = (*img)->ne;
    ptr[2] = (*img)->sw;
    ptr[3] = (*img)->se;
}

但是,由于某些未知原因(对我来说),loaded总是完成NewQuadImage(0.0)(这意味着它没有被修改)。

编译代码here

要运行此compiling code,请使用内容1.qad创建名为Q00Q11111的文件。 如果程序在结尾处打印Q00Q11111,则表示它正在工作。

感谢您dmckee,帮助我格式化帖子。

任何提示?

1 个答案:

答案 0 :(得分:0)

LoadQuadImageAux中,基本上你是这样做的:

ptr[0] = img->nw;
  //these are now two separate pointers that point to the same location

ptr[0] = NewBlackQuadImage();
  //this changes the location pointed to by ptr[0]
  //it doesn't change the location pointed to by img->nw
  //and it doesn't change the contents of the location pointed to by img->nw

您正在循环并更改ptr数组中保存的指针值,但您永远不会对通过引用传入的结构进行实际更改。

我认为你要做的只是:

img->nw = NewBlackQuadImage();

并且您对ptr数组的使用(可能是为了使循环更容易编码)导致混淆。

我的建议是完全免除ptr,并弄清楚如何编写代码以正确使用img指针。