我的功能有什么问题?

时间:2014-05-07 09:18:59

标签: c gtk

我正在尝试创建函数,而不是在main中有一堆代码,但我无法做到这一点,因为我对函数做错了,这是我的代码看起来像:

void static notebook(GtkWidget *table, GtkWidget *notebook) {
 notebook = gtk_notebook_new();
 ...
 attaching table to notebook
 ...
}


int main(int argc, char *argv[]) {
 GtkWidget *table;
 GtkWidget *notebook;

 ...
 notebook(table, notebook);
 ...
}

有人可以指出我的问题并帮我解决一下吗?

2 个答案:

答案 0 :(得分:3)

问题似乎是你假设参数既是函数的输入也是输出。但在C中,函数参数始终是副本。所以当你这样做时:

void static notebook(GtkWidget *table, GtkWidget *notebook) {
    notebook = gtk_notebook_new();

您正在修改notebook指针的本地副本,而不是main中的指针。 <{1}}中的notebook指针仍然未初始化。

要做你尝试的,最小的改变是:

main

但是用每个指针做这件事都很丑陋而且很麻烦。所以我建议进行一些重构:

  1. 创建东西的函数应该返回那个东西。
  2. 采用大量相关值的函数应采用void static notebook(GtkWidget **table, GtkWidget **notebook) { *notebook = gtk_notebook_new(); ... int main() { GtkWidget *table; GtkWidget *notebook; ... notebook(&table, &notebook); 类型的单个值。
  3. 请记住,C中的struct参数通常作为指针传递,因此您可以免费获得输入输出参数!
  4. 这样的事情:

    struct whatever

答案 1 :(得分:0)

以param "GtkWidget *table"为例,您只需将指针参数传递给函数,并为其分配内存:table = new xxx

GtkWidget *table这里是一个临时参数只存在于函数笔记本中,没有办法可以影响main中的实参。在{&#34;笔记本电脑&#34;之后,GtkWidget *tableGtkWidget *notebook的值保持不变功能完成。

所以你可以在笔记本功能的声明中使用指针指针,就像这个

 void static notebook(GtkWidget **table) {
     *table = new gtk_notebook_new();
 }

然后在main中,调用如下:

int main(int argc, char *argv[]) {
 GtkWidget *table;

 notebook(&table);
 ...
}

应该这样做。