我正在尝试修改几个函数以返回结构类型而不更改所有值。具体来说,我正在尝试以各种方式调整图像大小并返回新图像的尺寸。我有一个名为“picspec”的结构,其中包含netpbm图片文件的标题信息(宽度,高度,最大颜色值和表示格式的数字1-6)。
某些图片编辑可能需要修改所有这四个(元素?结构的某些部分),但许多只会影响其中的一部分,最好在这些情况下保持原始值不受影响。我的第一直觉是用以下结束函数:
picspec newinfo = {newx, newy, void, void};
return newinfo;
......我对编译错误并不特别感到惊讶。
注意:我意识到我可以通过将旧的“picspec”作为参数传递来轻松解决这个特定问题,但是“保持当前值”命令在其他情况下可能非常有用。我(目前非常有限)的指针知识让我觉得可以做到,但我没有取得太大成功。 (“指向自我的指针”教会了我关于链接列表的所有内容,但这并不是我想到的。)
是否有“保持当前价值”的机制或同样简洁的方式来实现相同的目标?如果没有,最实用的替代方案是什么?
答案 0 :(得分: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 ++编译器,通常是首选。
答案 1 :(得分:0)
如果返回部分结构并且不传递您操作的现有结构非常重要,则可以将“部分结构”定义为操作结构的函数,并返回该结构。
不幸的是,C不支持闭包。所以它会变得有点难看。您可能通过函数指针和指向绑定变量的void指针来表示闭包。