0

GTK プログラムにまだ問題があります。

エンコード (またはデコード) ボタンをクリックすると、次のエラー メッセージが表示されます。

セグメンテーション違反

ret問題は functions: andにあると思いますが、encode見つかりません。

    //..
    //gets the first argument(buf)
    tx1=gtk_entry_get_text(GTK_ENTRY(entry));
    //...
    //gets the second argument(pass)
    tx2=gtk_entry_get_text(GTK_ENTRY(entry));
    //....
    //signal to callback function encode when button clicked
    g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL);
    // ...
    //convert const char* to char*
    char* ret (const char *bd){
    char *c = new char[12];
    strcpy(c,bd);
    return c;
} 

//encode function
char encode(const char ebuf[],const char epass[]) {
    //This is the complete function I wrote and I am still having the error.
    char *buf=ret(ebuf);
    char *pass=ret(epass);
}
4

2 に答える 2

1

この行は意味がありません:

g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL);

encode()いくつかの引数を指定して呼び出すと、値が返され(ちなみに定義されていません)、それを関数へのポインタである にキャストcharします。次に、ボタンがクリックされると、Gtk+ はあなたを呼び出そうとしますが、これは明らかに有効な関数ではないため、セグメンテーション違反が発生します。charGCallbackchar

何をしたいのかわかりませんが、ルールに従ってプレイする必要があります。ルールでは、"clicked"コールバックはこのプロトタイプの関数へのポインターでなければならないと言われています。

void f(GtkButton *button, gpointer user_data);

それ以外の場合、あなたは本当に危険なプレーをしています。

先のコード例

たとえばencodechar*as 引数で関数を呼び出したいとします。次のようにできます。

void clicked_encode(GtkButton *button, gpointer user_data)
{
    char *d = static_cast<char*>(user_data);
    encode(d);
}

そして、コールバックを登録するには

g_signal_connect(but, "clicked", G_CALLBACK(clicked_encode), text);

textこれは、 が指すメモリが、少なくともコールバックと同じくらい存続することを前提としています。そうでない場合は、コピーを作成しますが、忘れずに解放する必要があります。

char *d = strdup(text);
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_text, 0);

//and the deleter function
void free_text(gpointer *data, GClosure *)
{
    char *d = static_cast<char*>(data);
    free(d);
}

当然、関数に複数のパラメーターが必要になる場合がありますが、渡すことができるポインターは 1 つだけです。解決策は、すべてを含む構造体 (または C++ を使用しているクラス) を定義することです。

FancyClass *d = new FancyClass(...);
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_fancy_class, 0);

void clicked_encode(GtkButton *button, gpointer user_data)
{
    FancyClass *d = static_cast<FancyClass*>(user_data);
    encode(d);
}

void free_fancy_class(gpointer *data, GClosure *)
{
    FancyClass *d = static_cast<FancyClass*>(data);
    delete d;
}

おい!encode()のメンバー関数を作成することもできますFancyClass。可能性は無限大!

これがあなたを正しい軌道に乗せることを願っています...

于 2013-05-20T22:29:35.150 に答える
0

より動的なサイズの文字列を使用したくない場合は、strncpy を使用して、コピーする文字数を制限します。

于 2013-05-20T21:35:12.040 に答える