我试图在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
,帮助我格式化帖子。
任何提示?
答案 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
指针。