Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[GTK+] 3 problemy.

Ostatnio zmodyfikowano 2012-07-03 11:55
Autor Wiadomość
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-06-26 21:02:14
Jesteś pewien? :)
To napisał Badman, ja nie ogarniam przekazywania struktur do funkcji. Wcześniej dobrze wszystko działało.
Błędy są zaznaczone w komentarzach.
P-59177
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:
C/C++
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 );
P-59266
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
P-59267
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:
C/C++
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:
C/C++
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.

 

P-59309
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?

C/C++
#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" )
        {
            //lamb = gtk_image_new_from_file( "lamb.png" );
            gtk_container_add( GTK_CONTAINER( noweDane->oknox ), lamb );
        }
       
        if( txt == "maluch" )
        {
            //maluch = gtk_image_new_from_file( "obraz.png" );
            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" ); // nie ma warningów
    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 )
    {
        // Oznacza, że plik nie został wczytany
        gtk_label_set_text( GTK_LABEL( napis2 ), tekstt2 );
    }
    else
    {
        // Plik wczytany
        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;
}
P-59344
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.

C/C++
#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" ) )
        {
            //lamb = gtk_image_new_from_file( "lamb.png" );
            gtk_container_add( GTK_CONTAINER( kontener2 ), noweDane->lamb );
            gtk_label_set_text( GTK_LABEL( noweDane->label ), lamborg );
           
        }
       
        if( !g_strcmp0( tekst, "maluch" ) )
        {
            //maluch = gtk_image_new_from_file( "obraz.png" );
            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 ) )
    // Oznacza, że plik nie został wczytany
         gtk_label_set_text( GTK_LABEL( napis2 ), tekstt2 );
    else
    // Plik wczytany
         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;
}
P-59359
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'
P-59370
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.
Frazy, które należy wpisać w wyszukiwarkę google:
P-59373
1 2 3 « 4 » 5
Poprzednia strona Strona 4 z 5 Następna strona