2017-10-29 2 views
0

Ich versuche, GTK-Programmierung zu lernen. Ich schrieb ein einfaches Programm in c. Ich versuche, einen Zeiger auf ein Etikett auf die gtk_label_set_selectable() Funktion zu übergeben, aber ich habe diese Warnung:Übergabe Argument 1 von 'gtk_label_set_selectable' von inkompatiblen Zeigertyp

#include <gtk/gtk.h> 
#include <stdlib.h> 

long i = 1; 

void showadd(short u,GtkWidget *l) 
{ 
    char * s; 
    s = (char*)malloc(20); 
    sprintf(s,"%ld",++i); 
    gtk_label_set_text(GTK_LABEL(l),s); 
} 

int main (int argc, char *argv[]) 
{ 
    gtk_init(&argc,&argv); 
    GtkWidget * win,* lable, * addButton,* SubstractButton,*box; 

    win = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

    addButton = gtk_button_new_with_label("+"); 
    lable = gtk_label_new("1"); 
    box = gtk_vbox_new(0,0); 

    g_signal_connect(win,"delete-event",G_CALLBACK(exit),NULL); 
    g_signal_connect(addButton,"clicked",G_CALLBACK(showadd),(gpointer)lable); 
    gtk_label_set_selectable(lable,1); //getting warring here 

    gtk_container_add(GTK_CONTAINER(win),box); 
    gtk_box_pack_start(GTK_BOX(box),lable,1,0,0); 
    gtk_box_pack_start(GTK_BOX(box),addButton,1,0,0); 
    gtk_widget_show_all(win); 

    gtk_main(); 
} 

whene ich das CDT in Eclipse kompilieren bekomme ich diese Warnung in der Konsole:

../src/Calculator.c:35:28: warning: passing argument 1 of ‘gtk_label_set_selectable’ from incompatible pointer type [-Wincompatible-pointer-types] 
    gtk_label_set_selectable(lable,1); 
          ^~~~~ 

Sollte ich diese Warnung ignorieren? Wenn nicht, was kann ich tun, damit es weggeht? Und wenn ja dann wie kann ich in Finsternis verschwinden lassen.

+1

Es erwartet ein 'GtkLabel *', und Sie übergeben es ein 'GtkWidget *'. Der Compiler lässt Sie wissen, dass Sie einen Fehler gemacht haben. Ändern Sie es, um ein 'GtkLabel *' zu übergeben. –

+0

Tom bedeutet, es als 'GtkLabel * lable;' zu deklarieren –

Antwort

1

In GTK müssen Sie auf die Typen Ihrer Widgets achten.

Normalerweise wird nur GtkWidget* statt speziellere Typen, weil die gtk_*_new() Funktionen auch einen Zeiger auf GtkWidget statt GtkLabel usw.

Um eine GtkWidget* in einer Funktion erwartet ein GtkLabel* Sie GTK_LABEL(label) mit werfen müssen eingesetzt.

Dies ist der Mechanismus, den Sie bereits verwenden, wenn Sie GTK_CONTAINER() und GTK_BOX() aufrufen.

Verwandte Themen