Gtk:Gtk-CRITICAL **:gtk_spin_button_get_value_as_int:断言'GTK_IS_SPIN_BUTTON(spin_button)'失败

时间:2016-11-01 07:29:33

标签: c gtk glade

GUI本身启动正常。每次按下按钮时,都会调用一个函数,该函数通过SPI与DAC进行通信。如果按下按钮并且函数gtk_spin_button_get_value_as_int()返回0,则会出现错误。 但是按钮本身就可以工作。

错误讯息:

  

Gtk-CRITICAL **:gtk_spin_button_get_value_as_int:断言'GTK_IS_SPIN_BUTTON(spin_button)'

这是我的源代码:

#include<stdio.h>
#include<wiringPi.h>
#include<gtk/gtk.h>

#define SPAM 1

#define SPIDELAY 500


#define CPLDSPEED 500000
#define DACSPEED 500000


GtkWidget *g_lbl_hello;
GtkWidget *g_lbl_count;
GtkWidget *spin1,*spin2,*spin3,*spin4,*spin5;
int channel1,dac1=0;
int channel2,dac2=0;
int channel3,dac3=0;
int channel4,dac4=0;
int dac5=0;

//Konvertierung der Adresse zum Sendeformat
char createAdress(int channel,int dac){
    char aout;
    int test;
    test=(channel*16)+dac;
    aout=(channel*16)+dac;
    printf("\n\nAdeDEC:%i\n",test);
    printf("Adresse:Fx%0x\n\n",aout);
    return aout;
}

//Kovertierung des DACWertes zum Sendeformmat
char *createValue(short dacvalue){

    static char vout[1];
    vout[1]=dacvalue & 0xFF;
    vout[0]=dacvalue>>8;
    printf("\n\nWert:Fx%02x%02x\n\n",vout[0],vout[1]);
    return vout;
}

void write_dac(int value,int dac,int channel){
    //Sendeformat der Adresse
    unsigned char a[0];
    printf("Schalte CS für DAC%i%i LOW\n",channel,dac);
        a[0]=createAdress(channel,dac);
        wiringPiSPIDataRW(0,a,1);


    printf("Schreibe Wert %hu auf den DAC%i%i",value,channel,dac);
    wiringPiSPIDataRW(1,createValue(value),2);

    printf("Schalte CS für DAC%i%i HIGH\n",channel,dac);
        a[0]=0x00;
        wiringPiSPIDataRW(0,a,1);

}


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

    //Sendeformat des DAC-Wertes
    unsigned char *v;

    //Zwischenspeicher für die Daten
    unsigned short value;
    int channel,dac, spilocj=0;
        //SPI Setup
        wiringPiSetup();
    //Kommunikation mit CPLD wird eingerichtet
        if (wiringPiSPISetup(0,CPLDSPEED)==-1)
        {
                printf("Du hast was falsch gemacht beim CPLDSPI\n");
        }

    //Kommunikation mit DAC wird eingerichtet
        if (wiringPiSPISetup(1,DACSPEED)==-1)
        {
                printf("Du hast was falsch gemacht beim DACSPI\n");
        }


    GtkBuilder      *builder;
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "Testgui.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);

    gtk_widget_show(window);
    gtk_main();

    return 0;
}

void prg_dac1(){
    write_dac(gtk_spin_button_get_value_as_int(spin1),1,2);
}

void prg_dac2(){
    write_dac(gtk_spin_button_get_value_as_int(spin2),2,2);
}

void prg_dac3(){
    write_dac(gtk_spin_button_get_value_as_int(spin3),3,2);
}

void prg_dac4(){
    write_dac(gtk_spin_button_get_value_as_int(spin4),4,2);
}

void prg_dac5(){
    write_dac(gtk_spin_button_get_value_as_int(spin5),5,2);
}

这是我的Gladeproject保存为GtkBuilder文件:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkAdjustment" id="dacwerte1">
    <property name="upper">65535</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkAdjustment" id="dacwerte2">
    <property name="upper">65535</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkAdjustment" id="dacwerte3">
    <property name="upper">65535</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkAdjustment" id="dacwerte4">
    <property name="upper">65535</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkAdjustment" id="dacwerte5">
    <property name="upper">65535</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkGrid" id="grid2">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="label5">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">DAC2</property>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label6">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">DAC3</property>
          </object>
          <packing>
            <property name="left_attach">2</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label7">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">DAC4</property>
          </object>
          <packing>
            <property name="left_attach">3</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label8">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">DAC5</property>
          </object>
          <packing>
            <property name="left_attach">4</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="prg_dac1" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">3</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button2">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="prg_dac2" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="top_attach">3</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button3">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="prg_dac3" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">2</property>
            <property name="top_attach">3</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button4">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="prg_dac4" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">3</property>
            <property name="top_attach">3</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button5">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="prg_dac5" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">4</property>
            <property name="top_attach">3</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkToolbar" id="toolbar1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="toolbar_style">icons</property>
            <property name="icon_size">10</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
            <property name="width">5</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="DAC">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">DAC1</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinButton" id="spin1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="max_length">5</property>
            <property name="invisible_char">●</property>
            <property name="activates_default">True</property>
            <property name="width_chars">10</property>
            <property name="invisible_char_set">True</property>
            <property name="adjustment">dacwerte1</property>
            <property name="climb_rate">1</property>
            <property name="update_policy">if-valid</property>
            <signal name="editing-done" handler="set_dac1" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">2</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinButton" id="spin5">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="max_length">5</property>
            <property name="invisible_char">●</property>
            <property name="width_chars">10</property>
            <property name="invisible_char_set">True</property>
            <property name="adjustment">dacwerte5</property>
            <property name="climb_rate">0.02</property>
            <property name="numeric">True</property>
          </object>
          <packing>
            <property name="left_attach">4</property>
            <property name="top_attach">2</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinButton" id="spin4">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="max_length">5</property>
            <property name="invisible_char">●</property>
            <property name="width_chars">10</property>
            <property name="invisible_char_set">True</property>
            <property name="adjustment">dacwerte4</property>
            <signal name="editing-done" handler="set_dac4" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">3</property>
            <property name="top_attach">2</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinButton" id="spin3">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="max_length">5</property>
            <property name="invisible_char">●</property>
            <property name="width_chars">10</property>
            <property name="invisible_char_set">True</property>
            <property name="adjustment">dacwerte3</property>
            <property name="update_policy">if-valid</property>
            <signal name="editing-done" handler="set_dac3" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">2</property>
            <property name="top_attach">2</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinButton" id="spin2">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="max_length">5</property>
            <property name="invisible_char">●</property>
            <property name="width_chars">10</property>
            <property name="invisible_char_set">True</property>
            <property name="input_purpose">number</property>
            <property name="adjustment">dacwerte2</property>
            <property name="wrap">True</property>
            <signal name="editing-done" handler="set_dac2" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="top_attach">2</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindowGroup" id="windowgroup1"/>
</interface>

另外,我收到有关GtkWidget指针spin1等数据类型的编译警告。但是将数据类型更改为适当的GtkSpinButton也无济于事。

  

main.c:在函数'prg_dac1'中:main.c:116:45:警告:传递   “gtk_spin_button_get_value_as_int”的参数1来自不兼容   指针类型write_dac(gtk_spin_button_get_value_as_int(spin1),1,2);                                                ^在/usr/include/gtk-3.0/gtk/gtk.h:185:0中包含的文件中,                    来自main.c:4:/usr/include/gtk-3.0/gtk/gtkspinbutton.h:194:7:注意:预期'结构   GtkSpinButton *'但参数类型为'struct GtkWidget *'gint   gtk_spin_button_get_value_as_int(GtkSpinButton * spin_button);

1 个答案:

答案 0 :(得分:0)

您永远不会将spin1等分配给Glade文件中的对象。请看gtk_builder_get_object()

要删除类型警告,请在调用站点使用显式转换,并将变量类型保留为GtkWidget。 GTK +提供了您可以使用的特殊宏:

    write_dac(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin1)),1,2);