2014-06-20 102 views
0

我想從入門集VAR PID,但我得到以下警告:如何從gtk_entry設置變量值?

gtk.c:7:6:警告:賦值時將指針整數,未作施放[默認啓用。

我怎樣才能使var pid ==條目?這是非常有價值的,因爲這個程序將發送信號給我們要輸入的id(pid)的進程。

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

pid_t pid; 
void sendSighup(GtkWidget *widget,GtkWidget *entry, gpointer label) { 

pid = gtk_entry_get_text(GTK_ENTRY(entry)); 
kill(pid,SIGHUP); 
} 
void sendSigint(GtkWidget *widget, gpointer label) { 


     kill(pid,SIGINT); 
} 
void sendSigkill(GtkWidget *widget, gpointer label) { 

    kill(pid,SIGKILL); 
} 
void sendSigterm(GtkWidget *widget, gpointer label) { 

    kill(pid,SIGTERM); 
} 
void sendSigstop(GtkWidget *widget, gpointer label) { 

    kill(pid,SIGSTOP); 
} 

accept_clicked (GtkButton *button, GObject *context_object) 
{ 
    GtkLabel *accept_lable1 = g_object_get_data (context_object, "label1"); 
    GtkEntry *accept_entry = g_object_get_data (context_object, "entry"); 

    const char *entry_in = gtk_entry_get_text (accept_entry); 
    gtk_label_set_text (accept_lable1, entry_in); 
} 



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

GtkWidget *button1; 
GtkWidget *button2; 
GtkWidget *button3; 
GtkWidget *button4; 
GtkWidget *button5; 
GtkWidget *quit; 
GtkWidget *set; 
GtkWidget *vseparator; 
GtkWidget *entry; 
GtkWidget *label; 
GtkWidget *label1; 
GtkWidget *label2; 

gtk_init(&argc, &argv); 

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
gtk_window_set_title(GTK_WINDOW(window), "Send Signal"); 
gtk_window_set_default_size(GTK_WINDOW(window), 300, 250); 
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 

frame = gtk_fixed_new(); 
gtk_container_add(GTK_CONTAINER(window), frame); 

button1 = gtk_button_new_with_label("Sighup"); 
gtk_fixed_put(GTK_FIXED(frame), button1, 8, 15); 
gtk_widget_set_size_request(button1, 80, 35); 

button2 = gtk_button_new_with_label("Sigint"); 
gtk_fixed_put(GTK_FIXED(frame), button2, 8, 60); 
gtk_widget_set_size_request(button2, 80, 35); 

button3 = gtk_button_new_with_label("Sigkill"); 
gtk_fixed_put(GTK_FIXED(frame), button3, 8, 105); 
gtk_widget_set_size_request(button3, 80, 35); 

button4 = gtk_button_new_with_label("Sigterm"); 
gtk_fixed_put(GTK_FIXED(frame), button4, 8, 150); 
gtk_widget_set_size_request(button4, 80, 35); 

button5 = gtk_button_new_with_label("Sigstop"); 
gtk_fixed_put(GTK_FIXED(frame), button5, 8, 195); 
gtk_widget_set_size_request(button5, 80, 35); 

set = gtk_button_new_with_label ("Set"); 
gtk_fixed_put(GTK_FIXED(frame), set, 200, 80); 
gtk_widget_set_size_request(set, 80, 35); 

quit = gtk_button_new_with_label("Quit"); 
gtk_fixed_put(GTK_FIXED(frame), quit, 200, 195); 
gtk_widget_set_size_request(quit, 80, 35); 

vseparator = gtk_vseparator_new(); 
gtk_widget_set_size_request(vseparator, 10, 240); 
gtk_fixed_put(GTK_FIXED(frame), vseparator, 95, 5); 

label = gtk_label_new("Enter PID:"); 
gtk_fixed_put(GTK_FIXED(frame), label, 165, 20); 

label2 = gtk_label_new("PID:"); 
gtk_fixed_put(GTK_FIXED(frame), label2, 110, 89); 

label1 = gtk_label_new("0000"); 
gtk_fixed_put(GTK_FIXED(frame), label1, 140, 89); 

entry = gtk_entry_new(); 
gtk_fixed_put(GTK_FIXED(frame), entry, 120, 40); 
gtk_widget_grab_focus(entry); 

g_object_set_data(G_OBJECT(set), "label1", label1); 
g_object_set_data(G_OBJECT(set), "entry", entry); 

g_signal_connect(GTK_BUTTON (set), "clicked", 
      G_CALLBACK (accept_clicked), set); 

g_signal_connect_swapped(G_OBJECT(window), "destroy", 
     G_CALLBACK(gtk_main_quit), NULL); 

g_signal_connect(button1, "clicked", 
    G_CALLBACK(sendSighup), NULL); 

g_signal_connect(button2, "clicked", 
    G_CALLBACK(sendSigint), NULL); 

g_signal_connect(button3, "clicked", 
    G_CALLBACK(sendSigkill), NULL); 

g_signal_connect(button4, "clicked", 
    G_CALLBACK(sendSigterm), NULL); 

g_signal_connect(button5, "clicked", 
    G_CALLBACK(sendSigstop), NULL); 


g_signal_connect(G_OBJECT(quit), "clicked", 
     G_CALLBACK(gtk_main_quit), G_OBJECT(window)); 


gtk_widget_show_all(window); 
gtk_widget_show(entry); 
gtk_widget_show(label); 

gtk_main(); 

return 0; 
} 

回答

0

在這條線,你既可以使用普通的老atoi

pid = atoi(gtk_entry_get_text(GTK_ENTRY(entry))); 

或使用更復雜的功能,如g-ascii-strtod

0

gtk_entry_get_text返回char * - 指向char的指針。你在你的代碼中將一個指向char的指針賦給int。這是根據C標準實現定義的,是不是可能是你想要的東西,這就是爲什麼你的編譯器給你一個警告:

6.3.2.3第6頁:

任何指針類型可以轉換整數類型。除了先前指定的 ,結果是實現定義的。如果 結果不能用整數類型表示,則行爲是 未定義。結果不需要在整數類型的任何值的範圍內。

例如,看看這個代碼這是問題的一個精確的表示你有:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
     char *p ="123456"; 
     int i = p; 
     printf("%d\n", i); 
     printf("%p\n", p); 
     exit 0; 
} 

它打印:

134514096 
0x80485b0 

字符指針被指定爲int的第7行。這會產生與您的代碼中相同的錯誤:

main.c:7:17:war寧:初始化將指針 整數沒有施放[默認啓用]

現在讓我們看看這是什麼分配的結果 - 不要忘記,這實現定義的行爲。第一個printf在賦值後打印變量值i。第二個printf使用%p指定符打印指針保存的地址,該指定符以實現定義的方式打印指針值。這些值結果相同 - 0x80485b0是十六進制的134514096。這裏發生的是指針值(即地址)已被分配給int。你的代碼也一樣。 C是一種非常簡單的語言,它不會做任何背後的事情。它不會自動將一串字符串中的數字轉換爲一個int。要將字符串轉換爲數字,您需要使用標準atoi函數或您正在使用的庫提供的自定義函數。