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

[GTK+] Jak w końcu idzie ten program...

Ostatnio zmodyfikowano 2012-09-26 21:14
Autor Wiadomość
czosnek17
Temat założony przez niniejszego użytkownika
[GTK+] Jak w końcu idzie ten program...
» 2012-08-28 21:49:47
W programie, który teraz piszę jest pętla(a właściwie będzie, tylko właśnie jest problem), w której wykonywane są obliczenia gry. Dlatego nie chcę jej opuszczać, tylko próbuję w ten sposób:

C/C++
void funkcjaY()
{
    // tutaj wczytywanie danych, weryfikacja, i edycja zmiennej aaa na true/false
    kod_c;
}

void funkcjaX()
{
   
    //początek pętli
    g_signal_connect( do funkcjaY ) // dane będą wprowadzane tak długo, aż będą poprawne
   
    if( aaa == true )
         kod_a;
    else
         kod_b;
   
    // tu będą obliczenia gry
    //koniec pętli
   
}
int main()
{
    aaa = false;
    z tad przechodze do funkcjaX();
}

Działa tak:
1. Kod_b
2. Po wejściu w funkcjaY wykonuje się tylko kod_c

I tu jest problem. Po wykonaniu kod_c (można nawet wielokrotnie), nie działa kod_a i kod_b. Tzn program nie wychodzi z funkcjaY. Co mam zrobić, żeby tak się stało?
P-63925
xevuel
» 2012-08-28 22:46:08
Nie wiem, pewnie powinieneś zmienić coś w programie.

A tak na serio: tworzysz temat, który nie opisuje kompletnie nic. Skąd mamy wiedzieć, dlaczego nie wykona się kod_b, skoro nie wiemy, jak wygląda funkcjaY? Nie podałeś ani jednego fragmentu programu, który jest zgodny z faktycznym stanem rzeczy...

Skoro "Tzn program nie wychodzi z funkcjaY", to pewnie program się zawiesza, tak?

Działa tak:
1. Kod_b
2. Po wejściu w funkcjaY wykonuje się tylko kod_c
Z pseudokodu wynika, że kod_b, jeśli sie wykona, to wykona się po wykonaniu kodu_c. Dlaczego więc umieściłeś w tym wyliczeniu kod_b na pierwszym miejscu?

Także podsumowując: umieść prawidłowy kod, albo konkretnej pomocy nie dostaniesz.
P-63931
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-28 22:55:57
Z pseudokodu wynika, że kod_b, jeśli się wykona, to wykona się po wykonaniu kodu_c. Dlaczego więc umieściłeś w tym wyliczeniu kod_b na pierwszym miejscu?
No wiem, że to dziwne, ale tak właśnie jest.

W kodzie raczej wszystko jest dobrze.
Daję 2 funkcje z problemem, mogę też dać cały kod jeżeli będzie potrzebny.

C/C++
void pobierz( GtkWidget * przycisk, gpointer dane )
{
    struct struktura * sss;
    sss =( struct struktura * ) dane;
    gtk_widget_hide( sss->graj );
    const gchar * zzz = "";
   
    const gchar * nic = "nic";
    const gchar * zle = "zle";
    const gchar * tr = "true";
    const gchar * fa = "false";
   
   
    //const gchar * wczyt;
    const gchar * tab[ 10 ] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
    sss->wczyt = gtk_entry_get_text( GTK_ENTRY( sss->poletxt ) );
   
    if( !g_strcmp0( sss->wczyt, tab[ 0 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 1 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 2 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 3 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 4 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 5 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 6 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 7 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 8 ] ) ||
    !g_strcmp0( sss->wczyt, tab[ 9 ] ) ||
    !g_strcmp0( sss->wczyt, zzz ) )
    {
       
       
        if( !g_strcmp0( sss->wczyt, tab[ 0 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 0 ] );
            sss->liczbazm = 1;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 1 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 1 ] );
            sss->liczbazm = 2;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 2 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 2 ] );
            sss->liczbazm = 3;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 3 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 3 ] );
            sss->liczbazm = 4;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 4 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 4 ] );
            sss->liczbazm = 5;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 5 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 5 ] );
            sss->liczbazm = 6;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 6 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 6 ] );
            sss->liczbazm = 7;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 7 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 7 ] );
            sss->liczbazm = 8;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 8 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 8 ] );
            sss->liczbazm = 9;
        }
       
        if( !g_strcmp0( sss->wczyt, tab[ 9 ] ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), sss->tab[ 9 ] );
            sss->liczbazm = 10;
        }
       
        sss->sprawdzdane = true;
       
        if( !g_strcmp0( sss->wczyt, zzz ) )
        {
            gtk_label_set_text( GTK_LABEL( sss->etykieta ), nic );
            sss->sprawdzdane = false;
        }
       
    } //if
    else
    {
        gtk_label_set_text( GTK_LABEL( sss->etykieta ), zle );
        sss->sprawdzdane = false;
    }
   
    gtk_entry_set_text( GTK_ENTRY( sss->poletxt ), zzz );
   
}

void gtrudny( GtkWidget * przycisk, gpointer dane )
{
   
    struct struktura * sss;
    sss =( struct struktura * ) dane;
    const gchar * tr = "true";
    const gchar * fa = "false";
   
    gtk_widget_hide( sss->graj );
    const gchar * zm[ 3 ] = { "1", "2", "3" };
    g_signal_connect( G_OBJECT( sss->wprowadz ), "clicked", G_CALLBACK( pobierz ), sss );
   
    if( sss->sprawdzdane == true )
         gtk_label_set_text( GTK_LABEL( sss->etykieta ), tr );
    else
         gtk_label_set_text( GTK_LABEL( sss->etykieta ), fa );
   
}
P-63932
xevuel
» 2012-08-28 23:10:30
Czy g_signal_connect nie ustawia tylko jakiegoś eventu, i procedurę jego obsługi? Tzn. w tym konkretnym przypadku, czy funkcja pobierz nie wykona się dopiero po odebraniu eventu clicked? To by wtedy tłumaczyło wszystko. Program idzie tak:

  • Ustawia zmienną sss->sprawdzdane na false
  • wywołuje gtrudny
  • funkcja gtrudny wywołuje funkcję g_signal_connect, ustawiając tym samym handler procedury obsługi zdarzenia "clicked"
  • wykonuje się instrukcja porównania, dlaczego wywołuje się kod_b to myślę że wiesz
  • user klika jakiś obiekt (przycisk?), wywołuje się funkcja pobierz z kodem_c
  • program powraca do stanu oczekiwania na następny komunikat

Nie znam GTK+ zbyt dokładnie, ale prawdopodobnie chodzi właśnie o to.
P-63933
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-28 23:16:48
No to chyba chodzi o to :/
Jest jakiś sposób, żeby uzyskać to co chciałem (wywoływać funkcję pobierz() w określonym miejscu po kliknięciu na przycisk i po skończeniu funkcji wrócić do miejsca wywołania)?
P-63934
xevuel
» 2012-08-28 23:20:30
Raczej wątpię, bo ta funkcja nie jest wywoływana z funkcji gtrudny, więc jak ma tam powrócić?

Co do problemu... Czy tego kodu:
C/C++
if( sss->sprawdzdane == true )
     gtk_label_set_text( GTK_LABEL( sss->etykieta ), tr );
else
     gtk_label_set_text( GTK_LABEL( sss->etykieta ), fa );
nie możesz po prostu umieścić w funkcji pobierz, skoro ma się wywoływać za każdym kliknięciem przycisku?
P-63935
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-08-28 23:25:56
Mogę, ale w pod g_signal_connect i tak będzie jeszcze kod. Musi tak być, jeżeli chcę wczytać tekst z pola tekstowego po wciśnięciu przycisku.
P-63936
xevuel
» 2012-08-29 08:06:11
No to czemu nie umieścisz odczytania zawartości pola tekstowego w procedurze obsługi eventu clicked? To, co Ty proponujesz jest niemożliwe, bowiem funkcja gtrudny wykona się tylko raz, nie więcej.
P-63943
« 1 » 2 3 4
  Strona 1 z 4 Następna strona