czosnek17 Temat założony przez niniejszego użytkownika |
» 2012-06-26 21:02:14 To napisał Badman, ja nie ogarniam przekazywania struktur do funkcji. Wcześniej dobrze wszystko działało. Błędy są zaznaczone w komentarzach. |
|
Badman |
» 2012-06-27 13:19:39 warning: 'lamb' may be used uninitialized in this function
warning: 'maluch' may be used uninitialized in this function
Oznacz tylko, że nie zmienne lamb i maluch nie zostały zainicjowane.
Co do:
Obrazki udaje się wczytać. Dodałem okno do struktury i program się nie kompiluje. Są 2 błędy:
expected primary-expression before '.' token |
Spójrz na deklarację zawartości struktury:
struct wieledanych { GtkWidget * etykieta; GtkWidget * label; GtkWidget * maluch; GtkWidget * lamb; GtkWidget * oknox; };
Wszystkie zmienne są wskaźnikami ! Dlatego żeby się odwołać do składników struktury, które są wskaźnikami stosuje się zapis struktura->wkaźnik, a nie struktura.wkaźnik
Zamień między innymi gtk_container_add( GTK_CONTAINER( wieledanych.oknox ), lamb ); na gtk_container_add( GTK_CONTAINER( noweDane->oknox ), lamb );
|
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2012-06-27 13:45:38 Jak mam: gtk_container_add( GTK_CONTAINER( wieledanych->oknox ), lamb ); To dostaje błąd: error: expected primary-expression before '->' token |
|
Badman |
» 2012-06-28 09:16:19 Jak mam:
gtk_container_add( GTK_CONTAINER( wieledanych->oknox ), lamb );
To dostaje błąd:
error: expected primary-expression before '->' token
|
Gdybyś dokładnie czytał, lub przepisał program by się skompilował i uruchomił :)
Masz:
struct wieledanych * noweDane; noweDane =( struct wieledanych * ) dane;
czyli, deklarujesz wskaźnik noweDane, który jest "typu" wieledanych, następnie zmiennej wskaźnikowej noweDane przypisujesz (wskazujesz na) dane, rzutując dane na "typ" wieledanych.
To:
struct wieledanych { GtkWidget * etykieta; GtkWidget * label; GtkWidget * maluch; GtkWidget * lamb; GtkWidget * oknox; };
jest tylko deklaracją struktury, a nie definicją, czyli wieledanych nie jest zmienną tylko nowym "typem" jak int, czy char.
Reasymując zmień na: gtk_container_add( GTK_CONTAINER( noweDane->oknox ), lamb );
oraz na gtk_container_add( GTK_CONTAINER( noweDane->oknox ), maluch );
Poczytaj na temat wskaźników ! Może na razie korzystaj ze zmiennych globalnych.
|
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2012-06-28 19:16:58 "Wystąpił problem z aplikacją szablon gtk.exe i zostanie ona zamknięta. Przepraszamy za kłopoty." Ehh... Co tu jeszcze jest źle? #include<gtk/gtk.h> #include<string>
using namespace std;
struct wieledanych { GtkWidget * etykieta; GtkWidget * label; GtkWidget * maluch; GtkWidget * lamb; GtkWidget * oknox; };
void dalej( GtkButton * przycisk, gpointer * dane ) { string lamborg = "lamborghini"; string malucht = "maluch"; GtkWidget * lamb = NULL; GtkWidget * maluch = NULL; const gchar * wcz = "wczytany"; const gchar * niewcz = "niewczytany"; GtkWidget * kontener2; GtkWidget * etykieta; GtkWidget * oknox; const gchar * tekst = "nowa etykieta"; string txt; struct wieledanych * noweDane; GtkWidget * etykieta3; const gchar * txt3; etykieta = gtk_label_new( NULL ); noweDane =( struct wieledanych * ) dane; etykieta = gtk_label_new( tekst ); gtk_container_add( GTK_CONTAINER( kontener2 ), etykieta ); tekst = gtk_entry_get_text( GTK_ENTRY( etykieta ) ); txt = tekst; if( txt == "lamborghini" || txt == "maluch" ) { if( txt == "lamborghini" ) { gtk_container_add( GTK_CONTAINER( noweDane->oknox ), lamb ); } if( txt == "maluch" ) { gtk_container_add( GTK_CONTAINER( noweDane->oknox ), maluch ); } } }
int main( int argc, char * argv[] ) { GtkWidget * ptxt; GtkWidget * napis; GtkWidget * kontener; GtkWidget * linia; GtkWidget * napis2; GtkWidget * przycisk; GtkWidget * lam; GtkWidget * mal; GtkWidget * lamb; GtkWidget * maluch; GtkWidget * okno; const gchar * tekstt = "TAK."; const gchar * tekstt2 = "NIE."; struct wieledanych wieleDanych; gtk_init( & argc, & argv ); okno = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" ); gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER ); gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 150 ); gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 ); przycisk = gtk_button_new_with_label( "dalej" ); gtk_widget_set_size_request( przycisk, 10, 20 ); lamb = gtk_image_new_from_file( "lamb.png" ); maluch = gtk_image_new_from_file( "obraz.png" ); kontener = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( okno ), kontener ); napis2 = gtk_label_new( " ~samochód~ " ); lam = gtk_image_new_from_file( "lamb.png" ); mal = gtk_image_new_from_file( "obraz.png" ); if( lamb == NULL ) { gtk_label_set_text( GTK_LABEL( napis2 ), tekstt2 ); } else { gtk_label_set_text( GTK_LABEL( napis2 ), tekstt ); } gtk_container_add( GTK_CONTAINER( kontener ), napis2 ); linia = gtk_hseparator_new(); gtk_box_pack_start( GTK_BOX( kontener ), linia, FALSE, TRUE, 17 ); napis = gtk_label_new( NULL ); gtk_container_add( GTK_CONTAINER( kontener ), napis ); ptxt = gtk_entry_new(); gtk_container_add( GTK_CONTAINER( kontener ), ptxt ); gtk_box_pack_start( GTK_BOX( kontener ), przycisk, FALSE, FALSE, 0 ); wieleDanych.etykieta = ptxt; wieleDanych.label = napis2; wieleDanych.lamb = lam; wieleDanych.maluch = mal; wieleDanych.oknox = okno; g_signal_connect( przycisk, "clicked", G_CALLBACK( dalej ), & wieleDanych ); g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); gtk_widget_show_all( okno ); gtk_main(); return 0; }
|
|
Badman |
» 2012-06-29 10:08:06 Nie chcę mi się analizować gdzie robisz błąd, poniżej zamieszczam trochę przerobioną działającą wersje. Przerobiłem wczytywanie obrazków, bo wczytując się w opis gtk_image_new_from_file okazło się, że nigdy nie zwraca NULL. Dlatego wykorzystałem GdkPixbuf.
#include <gtk/gtk.h>
struct wieledanych { GtkWidget * etykieta; GtkWidget * label; GtkWidget * maluch; GtkWidget * lamb; GtkWidget * oknox; GtkWidget * kontener; };
void dalej( GtkButton * przycisk, gpointer * dane ) { const gchar * lamborg = "lamborghini"; const gchar * malucht = "maluch"; const gchar * wcz = "wczytany"; const gchar * niewcz = "niewczytany"; GtkWidget * kontener2; const gchar * tekst; struct wieledanych * noweDane; GtkWidget * etykieta3; const gchar * txt3; noweDane =( struct wieledanych * ) dane; kontener2 = noweDane->kontener; tekst = gtk_entry_get_text( GTK_ENTRY( noweDane->etykieta ) ); if(( !g_strcmp0( tekst, "lamborghini" ) ) ||( !g_strcmp0( tekst, "maluch" ) ) ) { if( !g_strcmp0( tekst, "lamborghini" ) ) { gtk_container_add( GTK_CONTAINER( kontener2 ), noweDane->lamb ); gtk_label_set_text( GTK_LABEL( noweDane->label ), lamborg ); } if( !g_strcmp0( tekst, "maluch" ) ) { gtk_container_add( GTK_CONTAINER( kontener2 ), noweDane->maluch ); gtk_label_set_text( GTK_LABEL( noweDane->label ), malucht ); } } else gtk_label_set_text( GTK_LABEL( noweDane->label ), "nieznany pojazd" ); gtk_widget_show_all( kontener2 ); }
int main( int argc, char * argv[] ) { GtkWidget * ptxt; GtkWidget * napis; GtkWidget * kontener, * kontener2; GtkWidget * linia; GtkWidget * napis2; GtkWidget * przycisk; GtkWidget * okno; GtkWidget * maluch, * lamborgini; GdkPixbuf * mal = NULL, * lam = NULL; const gchar * tekstt = "TAK."; const gchar * tekstt2 = "NIE."; struct wieledanych wieleDanych; gtk_init( & argc, & argv ); okno = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" ); gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER ); gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 150 ); gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 ); przycisk = gtk_button_new_with_label( "dalej" ); gtk_widget_set_size_request( przycisk, 10, 20 ); kontener = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( okno ), kontener ); napis2 = gtk_label_new( " ~samochód~ " ); mal = gdk_pixbuf_new_from_file( "maluch.png", NULL ); maluch = gtk_image_new_from_pixbuf( mal ); lam = gdk_pixbuf_new_from_file( "lamborghini.png", NULL ); lamborgini = gtk_image_new_from_pixbuf( lam ); if(( mal == NULL ) ||( lam == NULL ) ) gtk_label_set_text( GTK_LABEL( napis2 ), tekstt2 ); else gtk_label_set_text( GTK_LABEL( napis2 ), tekstt ); gtk_box_pack_start( GTK_BOX( kontener ), napis2, FALSE, TRUE, 1 ); linia = gtk_hseparator_new(); gtk_box_pack_start( GTK_BOX( kontener ), linia, FALSE, TRUE, 17 ); kontener2 = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( kontener ), kontener2 ); napis = gtk_label_new( NULL ); gtk_container_add( GTK_CONTAINER( kontener2 ), napis ); ptxt = gtk_entry_new(); gtk_container_add( GTK_CONTAINER( kontener ), ptxt ); gtk_box_pack_start( GTK_BOX( kontener ), przycisk, FALSE, FALSE, 0 ); wieleDanych.etykieta = ptxt; wieleDanych.label = napis; wieleDanych.lamb = lamborgini; wieleDanych.maluch = maluch; wieleDanych.oknox = okno; wieleDanych.kontener = kontener2; g_signal_connect( przycisk, "clicked", G_CALLBACK( dalej ), & wieleDanych ); g_signal_connect( ptxt, "activate", G_CALLBACK( dalej ), & wieleDanych ); g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); gtk_widget_show_all( okno ); gtk_main(); return 0; }
|
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2012-06-29 21:55:48 Kurde nie działa. 2 błędy obj\Release\main.o:main.cpp || undefined reference to `gdk_pixbuf_new_from_file_utf8' |
|
DejaVu |
» 2012-06-29 23:30:29 To są błędy linkera. W kodzie nic nie trzeba zmieniać. Wystarczy dołączyć odpowiednie biblioteki w ustawieniach projektu.
|
|
1 2 3 « 4 » 5 |