matiko101 Temat założony przez niniejszego użytkownika |
Rzutowanie na strukturę » 2014-02-04 16:21:14 Może źle napisałem temat, ale nie wiem jak to się dokładnie nazywa ;) Posiadam zmienną gpointer i chce ją rzutować na strukturę tzn. struct Okna { GtkWidget * okno; GtkWidget * tlo; GtkWidget * kontener; };
Okna window;
g_signal_connect( G_OBJECT( buttony.button[ 7 ] ), "clicked", G_CALLBACK( & Przyciski::wypelnianie_nazw ), gpointer( & window ) );
int Przyciski::wypelnianie_nazw( GtkWidget * button, gpointer dane ) { fstream plik_nazwy; plik_nazwy.open( "programy.txt", std::ios::in ); for( int i = 0, j = 0; i != 6; i++ ) { view[ i ] = gtk_text_view_new(); getline( plik_nazwy, nazwa_globalna[ i ] ); bufor[ i ] = gtk_text_view_get_buffer( GTK_TEXT_VIEW( view[ i ] ) ); gtk_text_buffer_get_iter_at_offset( bufor[ i ], & iter[ i ], 0 ); gtk_text_buffer_insert( bufor[ i ], & iter[ i ], nazwa_globalna[ i ].c_str(), - 1 ); } }
Chciałbym, żeby cała struktura Okna była w metodzie wypelnianie_nazw. Będę potrzebował stamtąd okno i kontener. Proszę o pomoc, ale nie o odsyłanie do kursu ... (ogólnie to nic nie mogę znaleźć o g_signal_connect co by mi pomogło, bo cały czas mam problem z tą funkcją |
|
alixir |
» 2014-02-04 17:16:27 A w czym dokładniej problem ?
Zakładam, że gpointer jest typu void. Na takim wskaźniku nie można dokonać dereferencji wprost. W takim przypadku musiałbyś go rzutować statycznie na wskaźnik typu Okna |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2014-02-04 17:20:39 Tylko właśnie mam problem z tym jak to zrobić ;/ |
|
alixir |
» 2014-02-04 17:30:12 Okna * wsk; wsk = static_cast < Okna *>( dane ); |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2014-02-05 16:28:34 Nie za bardzo rozumiem co znaczy Okna * wsk i jak tego użyć EDIT: moja struktura jest w main,a dane w innej funkcji i nie wiem gdzie wstawić te dwie linie |
|
alixir |
» 2014-02-05 17:31:42 To może inne pytanie, bo może wcale nie potrzebujesz używać gpointer. Jest jakiś konkretny do tego powód? Nie możesz po prostu zdefiniować strukturę jako typ? (typedef) Wtedy możesz ją przekazywać bez żadnego rzutowania |
|
MrPoxipol |
» 2014-02-05 18:06:33 struct Point { int x; int y; };
void callback( GtkWidget * widget, gpointer user_data ) { Point * point = static_cast < Point *>( user_data ); cout << point->x << ", " << point->y << endl; }
Point point; point.x = 1; point.y = 5;
g_signal_connect( G_OBJECT( foo_button ), "clicked", G_CALLBACK( callback ), GPOINTER( & point ) ); Musisz wiedzieć, że gpointer to zwykłe void*. |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2014-02-05 18:23:43 Jesteście wielcy :P MrPoxipol Na razie zrobiłem to ze struktura globalna tzn. struct Okna { GtkWidget * okno; GtkWidget * tlo; GtkWidget * kontener; int x; };
int Przyciski::wypelnianie_nazw( GtkWidget * button, gpointer dane ) { Okna * window = static_cast < Okna *>( dane ); fstream plik_nazwy; plik_nazwy.open( "programy.txt", std::ios::in ); for( int i = 0, j = 0; i != 6; i++ ) { view[ i ] = gtk_text_view_new(); getline( plik_nazwy, nazwa_globalna[ i ] ); bufor[ i ] = gtk_text_view_get_buffer( GTK_TEXT_VIEW( view[ i ] ) ); gtk_text_buffer_get_iter_at_offset( bufor[ i ], & iter[ i ], 0 ); gtk_text_buffer_insert( bufor[ i ], & iter[ i ], nazwa_globalna[ i ].c_str(), - 1 ); cout << window->x; } }
window.x = 998; g_signal_connect( G_OBJECT( buttony.button[ 7 ] ), "clicked", G_CALLBACK( & Przyciski::wypelnianie_nazw ), gpointer( & window ) );
Tylko mam ostatnie pytanie :P W metodzie wypelnianie_nazw muszę mieć zadeklarowaną strukturę Okna(jest globalna),a chciałbym żeby struktura Okna nie była globalna tylko zadeklarowana w mainie. Dlatego mój problem rozwiązał się po części :( Alixir Zainteresuję się po skończeniu tej Aplikacji typedef, bo nigdy tego nie widziałem na oczy :D |
|
« 1 » 2 |