2017-01-23 6 views
0

gpointerから変数を取得するにはどうしたらいいですか?ここc gtk警告:初期化によってポインタから整数

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

コールバック部 は=「Y」に文字の行です。警告を与える:初期キャストせずにポインタの整数を作る[-Wint変換]が

gsignalからライン警告を与える:ポインタへのキャストを異なるサイズの整数から[-Wintツーポインタキャスト]

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

Iveはこれをいくつかの方法で試しましたが、それでもそれを得ることはできません。

ありがとうございました。

答えて

1
char on = "y"; 

は、単一charを保持するようonを宣言します。文字列はcharよりも大きいので、ポインタをcharまたはcharの配列として格納する必要があります。

問題は、onで使用できるようにして、使用する正しいタイプを決定することです。しかし、私はあなたがすでにこれを知っている投稿のエラーの性質を考えると、gpointerで混乱していると思います。

gpointerあなたはgpointer*を指定する必要はありません理由です基本的に

typedef void *gpoiner; 

です。これをあなたに欺かないでください。 gpointerと一緒に他のポインタタイプを使用する場合、それらの他のポインタタイプにはまだ*が必要です。

また、g_signal_connect()行が間違っています。 gpointer onは意味をなさない。

まだ私が話していることを理解していない場合は教えてください。


わかりましたので、なぜ

char on = "y"; 

は、メッセージ

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

を吐き出すのですか?

"y"はポインタです。それはタイプconst char *の式に評価されます。ポインタは、実行可能ファイルのコードセクションに存在する可能性があります。この部分は変更できません(したがって、const)。

charは、ポインタではなく整数です。ポインタを格納するには小さすぎる整数型を使用するかもしれないので、ポインタ値を明示的に求めない限り、ポインタ値を整数に変換することはできません。 (必要な場合、C標準はintptr_tuintptr_tを提供します。)この場合、あなたは尋ねなかったので、コンパイラはポインタのアドレスをcharに押し込みたいということを実際に意味していることを確認したいと考えています。

必要以上に小さい整数を使用する部分に注意してください。だからあなたのg_signal_connect()行が警告を出力する理由は:charはポインタを格納するのに十分ではないため、ポインタのようなchar値を扱うことは本当に悪いことにつながります。

+0

返信andlabsありがとうございます。はい、私はそれが遅すぎるのを見て、あなたが返事をしている間に投稿を編集していました。私はコードを編集してコンパイルしました。ポストはコードに更新されました。私はあなたの権利も関数right()に間違いがあったと思います。病気をあなたの言ったことを消化し、物事を修正しようとする。私がそれを得ることを得たときに悪い点検を与えなさい。 – fernny500

+0

返信andlabsありがとうございます。私はそれを初期化する前に存在しなかった場合、どのようにポインタからintに変わったのですか?私はポインタではなく変数を宣言して初期化したいと思っていました。私は何をしようとしているのか分かります。私は間違った方法でそれについて行きますか? コールバックラインのgpointerデータパラメータを構文化するにはいくつかの助けを使うことができます。 right()に間違いがあり、間違ったものを使用しました.bufを250に設定したので、そのことを説明します。私はちょうど良いもののgtk側を取得することを嬉しく思います。 – fernny500

+0

警告を説明しようとしました。それも助けてくれることを望む! – andlabs

0

これは私が探していたコードです。

コールバックに関するコード。

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

ユーザー機能のコードです。

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

そしてラインchar *on = 'n';

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

が、私はこれはOKだと思う警告を与える

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

関数右()から関連するスニペットために初期化するには、おそらくより良い方法がありますが、ポインタ、ポインタは意図されたものです。

線INT led_on = on;が警告

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

を与える再びそこより良い方法でもよいが、その意図は、変数ではないポインタを渡すことだったかもしれません。私はそれを数回テストし、それは失敗していないので、それを取る。

関連する問題