【问题标题】:typedef structures pointer issuetypedef 结构指针问题
【发布时间】:2015-12-29 12:20:15
【问题描述】:

解决方案:超时并没有提供回调函数所需的所有参数。 PRINT_OUT 代码适用于其他地方。这是我的内部错误!!!

我已经声明了以下类型/结构:

// -> month marked days storage structures

typedef gint _month[31];

typedef struct month_all {
  _month jan;
  _month feb;
  _month mar;
  _month apr;
  _month may;
  _month jun;
  _month jul;
  _month aug;
  _month sep;
  _month oct;
  _month nov;
  _month dec;
} months;

// -> general structure

typedef struct signal_map {
  widgets widg;
  months mnt;
} signal_map_data;

还有我的(更新)代码:

void load_marked_days (gint month, signal_map_data *smd){
  #ifdef debug
    g_print ("-> load_marked_days\n");
  #endif
  char buf[100];
  sprintf (buf, "%d", smd->mnt.jan[0]);
  g_print (buf);
}

// ----------------- main ----------------- /

int main (int argc, char *argv[]){
  GtkBuilder *gtkBuilder;
  signal_map_data smd;

  gtk_init (&argc, &argv);
  gtkBuilder = gtk_builder_new ();
  gtk_builder_add_from_file (gtkBuilder, "gui.glade", NULL);

  smd.widg.wmw.wnd = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "wnd") );
  smd.widg.wmw.btn_new = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_new") );
  smd.widg.wmw.btn_open = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_open") );
  smd.widg.wmw.btn_save = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_save") );
  smd.widg.wmw.btn_add = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_add") );
  smd.widg.wmw.btn_delete = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_delete") );
  smd.widg.wmw.tb_imgpath = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "tb_imgpath") );
  smd.widg.wmw.btn_path = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_path") );
  smd.widg.wmw.btn_make = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_make") );
  smd.widg.wmw.calendar = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "calendar") );
  smd.widg.wmw.img_month = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "img_month") );
  smd.widg.wmw.combobox1 = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "combobox1") );
  smd.widg.wmw.treeview = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "treeview") );

  smd.widg.wdaw.dlg_add = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "dlg_add") );
  smd.widg.wdaw.lb_q = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "lb_q") );
  smd.widg.wdaw.tb_text = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "tb_text") );
  smd.widg.wdaw.combobox2 = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "combobox2") );
  smd.widg.wdaw.btn_select_add = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_select_add") );
  smd.widg.wdaw.btn_cancel_add = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_cancel_add") );

  smd.widg.wdbw.dlg_browse = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "dlg_browse") );
  smd.widg.wdbw.btn_open_folder = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_open_folder") );
  smd.widg.wdbw.btn_cancel_browse = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_cancel_browse") );

  smd.widg.wdow.dlg_open = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "dlg_open") );
  smd.widg.wdow.btn_open_file = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_open_file") );
  smd.widg.wdow.btn_cancel_open = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_cancel_open") );

  smd.widg.wdsw.dlg_save = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "dlg_save") );
  smd.widg.wdsw.btn_save_file = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_save_file") );
  smd.widg.wdsw.btn_cancel_save = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "btn_cancel_save") );

  smd.widg.lst.lst1 = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "liststore1") );
  smd.widg.lst.lst2 = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "liststore2") );
  smd.widg.lst.lst3 = GTK_WIDGET (gtk_builder_get_object (gtkBuilder, "liststore3") );

  memset (smd.mnt.jan, 0, sizeof smd.mnt.jan);
  memset (smd.mnt.feb, 0, sizeof smd.mnt.feb);
  memset (smd.mnt.mar, 0, sizeof smd.mnt.mar);
  memset (smd.mnt.apr, 0, sizeof smd.mnt.apr);
  memset (smd.mnt.may, 0, sizeof smd.mnt.may);
  memset (smd.mnt.jun, 0, sizeof smd.mnt.jun);
  memset (smd.mnt.jul, 0, sizeof smd.mnt.jul);
  memset (smd.mnt.aug, 0, sizeof smd.mnt.aug);
  memset (smd.mnt.sep, 0, sizeof smd.mnt.sep);
  memset (smd.mnt.oct, 0, sizeof smd.mnt.oct);
  memset (smd.mnt.nov, 0, sizeof smd.mnt.nov);
  memset (smd.mnt.dec, 0, sizeof smd.mnt.dec);

  char buf[100];
  sprintf (buf, "%d", smd.mnt.jan[0]);
  g_print (buf);

  gtk_builder_connect_signals (gtkBuilder, &smd);
  g_object_unref (G_OBJECT (gtkBuilder) );

  g_timeout_add (1000, (GSourceFunc) load_marked_days, &smd);

但是我如何才能访问单日(例如每月 1 日的 _month[0])以获得它的价值?

load_marked_days 内部的这个是错误的:

char buf[100];
sprintf (buf, "%d", smd->mnt.jan[0]);
g_print (buf);

-163321601

char buf[100];
sprintf (buf, "%d", &smd->mnt.jan[0]);
g_print (buf);

4201655

如何获得我的价值???两者都不返回0 ... 但是在我的主要功能中,这个“一天”的打印工作并打印0 ..? 我的指针怎么了?

【问题讨论】:

  • 目前,您的问题可能无法通过提供的详细信息来回答。我认为load_marked_days 的行为会很有用。否则,“我如何才能访问一天”非常简单,而且您似乎像其他人一样这样做。
  • smd->mnt->jan[0] 是正确的。最可能的问题是变量的生命周期。如果它们中的任何一个在函数范围内声明(因此在堆栈上),但在该函数范围之外“使用”,则会出现段错误。要确定,请添加您的完整代码(或更准确地说,是具有相同问题的代码的最小但完整版本)
  • 您描述的症状似乎与向printf 提供错误数据类型时的症状相匹配。例如,%d 告诉 printf 期待一个 int 参数,但是您给出的类型是 gint。根据the manual,这应该是兼容的,但是为了安全起见,您可能需要通过深入研究预处理的源代码来验证这一点。
  • 我添加了更详细的代码。请再看看。
  • 尝试 Amits 建议,即将 smd 变量声明为全局变量,然后重试。乍一看,除了变量存储在堆栈上之外,一切看起来都不错。

标签: c typedef


【解决方案1】:

解决方案:超时并没有提供回调函数所需的所有参数。 PRINT_OUT 代码适用于其他地方。这是我的内部错误!!! – Martin Fischer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多