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

标签 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;
}

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

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 .

要运行此编译代码,请创建一个名为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 指针。

关于c - 在 C 中通过引用传递结构体时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5755628/

相关文章:

ios - 类似于关系数据库的模型的类或结构?

c++ - 在一行中使用 vector push_back 和 "temp"结构(如果可能)

c - 替代 C 中的嵌套结构

c - 如何实现对结构的各个字段执行相同操作的函数?

我们可以在 C 中的 printf 中对多个格式描述符只使用一个变量吗?

c - Printf 干扰 I2C 模块值读取

C 程序跳过用户输入?

c - 从 2 位分支预测器到 8 位预测器

rust - 将向量切片作为参数传递给函数

variables - Dart-如何将迭代器值传递到Dart中的回调中?