2017-01-23 2 views
0

Wie kann ich die Variable von gpointer bekommen, damit ich es verwenden kann.c gtk warning: Initialisierung macht Ganzzahl vom Zeiger

void 
right_y (GtkButton *button, gpointer on) 
{ 
    right(on); 
} 

Hier ist der Callback-Teil Die Zeile mit char on = "Y"; gibt Warnung: Initialisierung ohne Guss ganze Zahl von Zeigern macht [-Wint-Konvertierung]

Die gsignal Linie gibt Warnung: cast Zeiger von Ganzzahl unterschiedlicher Größe [-Wint-to-Zeiger-cast]

char on = "y"; 
button = gtk_button_new_with_label ("Led On");       
g_signal_connect (button, "clicked", G_CALLBACK (right_y), (gpointer) on); 

Ich habe es versucht ein paar verschiedene Möglichkeiten und immer noch nicht bekommen.

Danke.

Antwort

1
char on = "y"; 

erklärt on als eine einzigechar halten. Strings sind mehr als eine char, so dass Sie sie entweder als Zeiger auf char oder auf ein Array von char s speichern müssen.

Das Problem ist, was Sie mit on tun können bestimmt den richtigen Typ zu verwenden. Aber ich stelle mir vor, angesichts der Art der Fehler in der Post, dass Sie das bereits wissen und durch die gpointer verwirrt sind.

gpointer ist im Grunde

typedef void *gpoiner; 

Aus diesem Grund müssen Sie nicht geben Sie eine * mit gpointer. Lass dich nicht davon täuschen; Wenn Sie andere Zeigertypen neben gpointer verwenden, benötigen Sie noch die * für diese anderen Zeigertypen!

Auch die g_signal_connect() Zeile ist falsch; gpointer on macht keinen Sinn.

Bitte lassen Sie mich wissen, wenn Sie immer noch nicht verstehen, worüber ich spreche.


Okay, also warum

char on = "y"; 

ausspucken die Nachricht

warning: initialization makes integer from pointer without a cast [-Wint-conversion] 

?

"y" ist ein Zeiger. Es wird ein Ausdruck vom Typ const char * ausgewertet. Der Zeiger befindet sich wahrscheinlich im Codeabschnitt der ausführbaren Datei, wo er nicht geändert werden kann (daher die const).

char ist eine Ganzzahl, kein Zeiger. Es ist normalerweise nicht möglich, Zeigerwerte in Ganzzahlen zu verschieben, es sei denn, Sie fragen explizit danach, weil Sie möglicherweise einen Integer-Typ verwenden, der zu klein ist, um den Zeiger zu speichern. (Für die Zeiten, in denen es notwendig ist, bietet der C-Standard intptr_t und uintptr_t.) In diesem Fall haben Sie nicht gefragt, also möchte der Compiler sicherstellen, dass Sie wirklich gemeint haben, dass Sie die Adresse des Zeigers in eine char schieben wollten.

Beachten Sie den Teil über die Verwendung einer kleineren ganzen Zahl als notwendig. Deshalb gibt Ihre Zeile g_signal_connect() die Warnung aus, die es tut: char ist nicht groß genug, um einen Zeiger zu speichern, also die Behandlung eines char Wertes wie ein Zeiger ist verpflichtet, wirklich schlechte Sachen zu produzieren.

+0

Danke für die Antwort andlabs. Ja, ich habe das zu spät gesehen und habe meinen Post bearbeitet, während Sie geantwortet haben. Ich habe auch den Code bearbeitet und kompiliert. Der Beitrag wurde auf den Code so aktualisiert, wie es jetzt ist, ich glaube dein Recht hatte ich auch einen Fehler in der Funktion right(). Ich verdauere, was du sagst, und versuche, die Dinge wieder in Ordnung zu bringen. Wenn ich es durchhalte, gebe ich die Zecke. – fernny500

+0

Danke für die Antwort andlabs. Was ich nicht verstehe, ist char on = "y", wenn es nicht existierte, bevor ich es initialisiert habe, wie hat es sich von einem Zeiger zu einem int gewandelt. Ich hoffte, ich würde eine Variable deklarieren und initialisieren, nicht einen Zeiger. Sie können wahrscheinlich sehen, was ich versuche zu tun. Gehe ich falsch herum? Wie man den gpointer Datenparameter der Rückruflinie syntaxiert, könnte ich etwas Hilfe verwenden. Es gab einen Fehler in right(), benutzte den falschen, buff auf 250 gesetzt, so dass das erklärt. Ich würde mich freuen, die GTK-Seite der Dinge richtig zu machen. – fernny500

+0

Versuchte, die Warnungen zu erklären; hoffe das hilft auch! – andlabs

0

Dies ist der Code, nach dem ich gesucht habe.

Der Code für den Rückruf.

char *on = 'n'; 
    button = gtk_button_new_with_label ("Led On");       
    g_signal_connect (button, "clicked", G_CALLBACK (right_y), on); 

Der Code für die Benutzerfunktion.

static void 
right_y (GtkButton *button, gpointer on) 
{ 
    int led_on = on; 
    right(led_on); 
}  

Und ein relevanter Ausschnitt aus Funktion rechts()

void right(char state) { 
    buf[0] = state; 
    int bytes_written = 0; 
    bytes_written = write(s, buf, strlen(buf)); 
} 

Die Linie char *on = 'n'; die Warnung

initialization makes pointer from integer without a cast [-Wint-conversion] 

Ich denke, gibt dies in Ordnung ist, denn obwohl es gibt wahrscheinlich bessere Möglichkeiten zur Initialisierung ein Zeiger, ein Zeiger ist, was beabsichtigt war.

Die Linie int led_on = on; gibt der Warnung

initialization makes integer from pointer without a cast [-Wint-conversion] 

Wieder könnte es bessere Möglichkeiten, aber die Absicht war, eine Variable keinen Zeiger zu übergeben. Ich habe es ein paar Mal getestet und es hat nicht versagt, also ich nehme es.

Verwandte Themen