1

我正在尝试修改几个函数以返回结构类型而不更改所有值。具体来说,我正在尝试以各种方式调整图像大小并返回新图像的尺寸。我有一个名为“picspec”的结构,其中包含 netpbm 图片文件的标题信息(宽度、高度、最大颜色值和表示格式的数字 1-6)。

一些图片编辑可能需要修改所有这四个(元素?结构的一部分),但许多只会影响其中的一部分,在这些情况下最好保持原始值不变。我的第一个直觉是用以下方式结束函数:

picspec newinfo = {newx, newy, void, void};
return newinfo;

...而且我对编译器错误并不感到特别惊讶。

注意:我意识到我可以通过将旧的“picspec”作为参数传递来轻松解决这个特定问题,但是“保持当前值”命令在其他情况下可能非常有用。我(目前非常有限)对指针的了解使我认为它可以做到,但我在搜索它方面并没有取得太大的成功。(“指向自我”教会了我所有关于链表的知识,但这不是我的想法。)

是否有“保持当前价值”的机制或类似简洁的方式来实现相同的目标?如果没有,最实用的选择是什么?

4

2 回答 2

6

有两种方法可以使用函数来操作 C 结构:

如果返回值,则必须返回整个结构。您实际上仍然不必创建新副本:

MyStruct myStructModified(MyStruct s, int delta) {
  // s is already a copy of the original value
  s.member += delta;
  return s;
}

...

{ // somewhere else, with MyStruct s
     // replace value of s with new one
     s = myStructModified(s, 10);
}

返回相对较小的结构肯定是让自己专注于实际问题的好方法,而不是 C 指针问题,但是如果你想修改现有结构,并且仅限于 C(而不是没有 OOP 的 C 类 C++),那么你必须使用指针:

void modifyMyStruct(MyStruct *sp, int delta) {
  sp->member += delta;
}

...

{ // somewhere else, with MyStruct s
     // pass pointer to s to function, which will modify it in-place
     modifyMyStruct(&s, 10);
}

如果可以使用 C++ 编译器,还有第三种选择,使用 C++ 引用,它只是糖衣指针:

void modifyMyStruct(MyStruct &s, int delta) {
  s.member += delta;
}

...

{ // somewhere else, with MyStruct s
     // pass reference to s to function, which will modify it in-place
     modifyMyStruct(s, 10);
}

使用值更干净、更安全,但速度较慢(复制结构中的所有数据)。使用指针是有效的(只传递地址,通常在 CPU 寄存器中,非常快),但如果你做错了,你很容易遇到崩溃的错误。C++ 引用比指针更简洁、更安全,如果可以使用 C++ 编译器,通常是首选。

于 2012-11-13T18:56:22.450 回答
0

如果返回部分结构真的很重要,而不是传递您操作的现有结构,您可以将“部分结构”定义为操作结构的函数,然后返回它。

不幸的是,C 不支持闭包。所以它会变得有点难看。您可能会用一个函数指针和一个指向绑定变量的 void 指针来表示闭包。

于 2012-11-13T19:04:46.940 回答