在C中通过引用传递结构时出现问题

在C中通过引用传递结构时出现问题,c,reference,struct,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) {

我试图在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;
}
但是,由于我不知道的原因,加载的始终是NewQuadImage0.0,这意味着它没有被修改

编译代码

要运行此编译代码,请创建一个名为1.qad的文件,其内容为Q00Q11111。 如果程序最后打印Q00Q11111,则表示它正在工作

谢谢dmckee,帮我格式化我的帖子

有什么提示吗?

在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指针。

欢迎使用堆栈溢出。几点。首先,编辑器有一个代码格式选项,通常比指向场外代码更可取。第二,我们实际上不喜欢看到一篇It's not work post附带一百行代码。第三,我们更希望你做更多的工作:你做了什么来理解这个问题?您是否尝试过编写一个最小的硬编码版本,以查看代码段是否正确?这实际上是对调试技术的帮助请求吗?通过上面注释中的一个简单示例,我指的是更像中所示的代码。请注意,我们如何不必费力地通过一堆无关的函数来搜索代码中不起作用的部分?使您想要帮助的人的生活更轻松。QuadImageInfo在这些结构定义中出现3次。我的头爆炸了。哈哈,失踪了。但这与我的问题解决方案无关如果程序没有打印Q00Q11111,那么它在做什么?这就是我现在正在做的。但我在每个函数中重复代码4次。这就是我想要避免的。
img->nw = NewBlackQuadImage();