Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-02-18 22:59:08

  blazeroot - Użytkownik

blazeroot
Użytkownik
Skąd: Katowice
Zarejestrowany: 2009-11-30
Serwis

C i GTK+

Mam problem z przekazaniem do funkcji wskaźnika label.. Nie rozumiem co jest nie tak, proszę o pomoc..

Kod:

void write_character_to_label(GtkWidget *label)
{
  gtk_label_set_markup (label, "test");
}

[...]

label = gtk_label_new ("aaa");

button = gtk_button_new_with_label ("Przycisk");
g_signal_connect( G_OBJECT (button),
      "clicked",
      G_CALLBACK(write_character_to_label),
      label);

co tu jest nie tak? :(

Ostatnio edytowany przez blazeroot (2010-02-18 22:59:33)

Offline

 

#2  2010-02-19 01:03:17

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C i GTK+

podaj jakie sa obojawy (komunikaty kompilatora / dzialanie)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#3  2010-02-19 12:50:35

  blazeroot - Użytkownik

blazeroot
Użytkownik
Skąd: Katowice
Zarejestrowany: 2009-11-30
Serwis

Re: C i GTK+

W konsoli (program się kompiluje bez problemu):

Kod:

Gtk-CRITICAL **: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed

Rozumiem co mu nie pasuje, jednak nie mam pojęcia dlaczego.

Offline

 

#4  2010-02-19 13:35:39

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C i GTK+

1. sprawdz w write_character_to_label przed gtk_label_set_markup co tak na prawde dostaje ta funkcja - conajmniej porownaj wartosc HEX otrzymanego wskaznika z wskaznikiem utworzonym przez gtk_label_new
2. sprawdz po "label = gtk_label_new ("aaa");" wartosc zwracana przez GTK_IS_LABEL (label)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#5  2010-02-19 14:15:03

  blazeroot - Użytkownik

blazeroot
Użytkownik
Skąd: Katowice
Zarejestrowany: 2009-11-30
Serwis

Re: C i GTK+

Ad1. Są inne wartości, czyli nie to samo miejsce w pamięci, czyli rzeczywiście funkcja nie otrzymuje tego co ma otrzymać.
Ad2. TRUE

Ciężka sprawa, jak dla mnie przynajmniej, nie widzę gdzie tu może być powód tego :-/

Offline

 

#6  2010-02-19 15:35:12

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C i GTK+

tu juz trzeba widziec wiekszy fragment kodu - jaki jest zasieg zmiennej label, czy cos innego modyfikuje jej wartosc?

(slabo znam gtk ale) przypuszczam ze do write_character_to_label przekazywana jest wartosc label z momentu nacisniecia przycisku ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#7  2010-02-19 17:25:35

  blazeroot - Użytkownik

blazeroot
Użytkownik
Skąd: Katowice
Zarejestrowany: 2009-11-30
Serwis

Re: C i GTK+

Kod:

void write_character_to_label(GtkWidget *label)
{
  gtk_label_set_markup (label, "test");
}


int main (int argc, char *argv[])
{
[...]
GtkWidget *label;
[...]
/* INICJACJA GTK */
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
  gtk_init (&argc, &argv);
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);

  /* TWORZYMY GŁÓWNE OKNO */
  win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_container_set_border_width (GTK_CONTAINER (win), 8);
  gtk_window_set_title (GTK_WINDOW (win), "Klawiatura");
  gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
  gtk_widget_realize (win);
  g_signal_connect (win, "destroy", gtk_main_quit, NULL);


  label = gtk_label_new ("aaa");
  if (GTK_IS_LABEL (label))
  {
    printf("TAK\n");
  }
  else
  {
    printf("NIE\n");
  }
[...]
/* TWORZYMY TABLICE PRZYCISKOW */
  char first_row[] = "1234567890";
  char second_row[] = "qwertyuiop";
  char third_row[] = "asdfghjkl";
  char fourth_row[] = "zxcvbnm?";

  char *label_text;

  int i;
  short col = 1;

  /* TWORZYMY TABELE GTK */
  table = gtk_table_new (10, 5, TRUE);
  gtk_container_add (GTK_CONTAINER (win), table);

  for (i = 0; i < 10; i++)
  {
    label_text = first_row[i];
    button = gtk_button_new_with_label (&label_text);
    gtk_table_attach_defaults (GTK_TABLE (table), button, i, i+1, col, col+1);
    g_signal_connect( G_OBJECT (button),
                      "clicked",
                      G_CALLBACK(write_character_to_label),
                      label);
  }
[...]

Domyślnie jeszcze konkretna litera będzie przesyłana do funkcji, ale teraz jakoś przestało mi coś działać bo jakiś błąd robię, tak więc podaję kod jeszcze bez próbnego przekazania litery.

PS. jestem świadom że ten kod może być gorszy niż tragiczny..

Offline

 

#8  2010-02-19 17:43:30

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C i GTK+

rozumiem ze nic innego nie modyfikuje tego wskaznika ... moze dla testu zrob go zmienna globalna


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#9  2010-02-19 17:46:17

  blazeroot - Użytkownik

blazeroot
Użytkownik
Skąd: Katowice
Zarejestrowany: 2009-11-30
Serwis

Re: C i GTK+

Działa! Super! W zasadzie to chyba nie powinno na tej zasadzie działać, ale ważne że działa, bardzo mi na czasie zależy. Dzięki Ci bardzo! Jak wymyślę dlaczego nie działało tak jak trzeba to na pewno napiszę tutaj ;-)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)