Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erikcmauricio en 27 Julio 2017, 01:16 am



Título: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 01:16 am
Buenas tardes.....

He estado tratando de hacer un simple programa en GTK con Glade que al hacer click en un botón coloque un texto en un label.... todo va bien si escribo así
Código
  1. void texto_label(void)
  2. {
  3.       char text[] = "hola como estan";
  4. }
  5.  
  6. gtk_label_set_text (GTK_LABEL(label), text);
  7.  
  8. Hasta aquí funciona perfecto....
  9.  
  10. Luego cree un .h y un .c llamados venta.c venta.h
  11.  
  12. venta.h
  13. #ifndef VENTA_H_INCLUDED
  14. #define VENTA_H_INCLUDED
  15.  
  16. char letras (void);
  17.  
  18. #endif
  19.  
  20.  
  21. Ahora venta.c
  22. #include "venta.h"
  23.  
  24. char letras(void)
  25. {
  26.      char a;
  27.      a = "hola amigos";
  28.      return a;
  29. }
  30.  
  31. en el programa principal que se llama ventana.c
  32. //cree una funcion llamada texto_label
  33.  
  34. void texto_label(void)
  35. {
  36.      char text[] = letras();
  37.      gtk_label_set_text (GTK_LABEL(label), text);
  38. }
  39.  
Al compilar da error.... he probado todo lo habido y por haber y nada....

Lo que quiero es que al hacer click en el botón... la función letras de venta.c devuelva el texto y lo coloque en el label...

Gracias

[MOD] Usar etiquetas GeSHi, para publicar codigo.


Título: Re: Problema con GTK y C
Publicado por: ivancea96 en 27 Julio 2017, 01:29 am
Tienes varios errores importantes en estos códigos.

Código
  1. char letras(void)
  2. {
  3.      char a;
  4.      a = "hola amigos";
  5.      return a;
  6. }
Una cadena no es un char. Es un char*. Puntero a char, no un solo char. Tendrás que cambiar el retorno de la función y la variable "a" (o, simplemente, cambiarlo por return "hola amigos";.

Luego:
Código
  1. void texto_label(void)
  2. {
  3.       char text[] = "hola como estan";
  4. }
  5.  
  6. gtk_label_set_text (GTK_LABEL(label), text);
No es posible que accedas a la variable "text" desde fuera de la función. No sé en qué contexto haces eso.

En cualquier caso, para próximos problemas, pon el error. El error da toda la información necesaria para resolver el problema. El error también dirá en qué líneas ocurre, así que es interesante que nos digas en qué línea te lo daba.


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 03:54 am
Hola..... gracias por responder....

Hice lo que me dijiste en venta.c y no funciona...
Código
  1. #include "venta.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. char letras(void)
  6. {
  7. return "Hoy es un gran dia";
  8. }
  9.  
  10. Ahora en el .c principal.....
  11.  
  12. void texto_label(void)
  13. {
  14.        gtk_label_set_text(GTK_LABEL(label), letras());
  15. }
  16.  
  17. Esto es lo que muestra a la hora de compilar............
  18.  
  19. In file included from ventana.c:4:0:
  20. venta.h:12:7: warning: extra tokens at end of #endif directive
  21. #endif&#65279;
  22.       ^
  23. ventana.c: In function ‘texto_label’:
  24. ventana.c:40:39: warning: passing argument 2 of ‘gtk_label_set_text’ makes pointer from integer without a cast
  25.  gtk_label_set_text(GTK_LABEL(label), letras());
  26.                                       ^
  27. In file included from /usr/include/gtk-2.0/gtk/gtkaccellabel.h:38:0,
  28.                 from /usr/include/gtk-2.0/gtk/gtk.h:35,
  29.                 from ventana.c:1:
  30. /usr/include/gtk-2.0/gtk/gtklabel.h:112:23: note: expected ‘const gchar *’ but argument is of type ‘char
  31. void                  gtk_label_set_text          (GtkLabel      *label,
  32.                       ^
  33. /tmp/ccgL6s1G.o: En la función `texto_label':
  34. /home/erikc/Documentos/ventana-2/ventana.c:40: referencia a `letras' sin definir
  35. collect2: error: ld returned 1 exit status
  36.  
  37.  

[MOD] Usar etiquetas GeSHi, para publicar codigo.


Título: Re: Problema con GTK y C
Publicado por: ivancea96 en 27 Julio 2017, 03:58 am
No del todo:

Una cadena no es un char. Es un char*. Puntero a char, no un solo char. Tendrás que cambiar el retorno de la función


Es decir:

Código
  1. char* letras()


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 04:47 am
Sorry... para que se entienda bien debo mostrar el código completo.... es este en ventana.c (el c principal)

Código
  1.  
  2. #include <gtk/gtk.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "venta.h"
  6.  
  7. //extern char letras();
  8.  
  9. GtkWidget *label;
  10. GtkWidget *button;
  11. GtkWidget *button2;
  12. GtkWidget *button3;
  13. GtkWidget *button4;
  14. GtkWidget *texto;
  15.  
  16. GtkWidget *labelMsg;
  17. GtkWidget *buttonMsg;
  18.  
  19. GtkWidget *form_msg;
  20. /*char letras(void)
  21. {
  22. //return("Eres un playo");
  23. char textFunc[] = "pulga h";
  24. return(textFunc);
  25. }*/
  26.  
  27. void texto_label(void)
  28. {
  29. //char text[] = letras();
  30. //text = letras();
  31. //gchar b;
  32. //b = text;
  33. //b=text;
  34.  
  35. //char b[] = letras();
  36. //text = letras(void);
  37. //text == "pulga";
  38. //gtk_label_set_text(GTK_LABEL(label), "Hola guineo plátano");
  39. //gtk_label_set_text(GTK_LABEL(label), letras());// cierra la ventana
  40. //gtk_label_set_text(GTK_LABEL(label), letras(void));//error
  41. gtk_label_set_text(GTK_LABEL(label), letras());
  42. //gtk_label_set_text(GTK_LABEL(label), b);
  43. //gtk_label_set_text(GTK_LABEL(label), text);
  44.  
  45. //char cadena[20];
  46.  
  47. //itoa (resSuma, cadena, 10); // el 10 es base decimal
  48.  
  49. //gtk_label_set_text(GTK_LABEL(label), cadena);
  50.  
  51. }
  52.  
  53. int main(int argc, char *argv[])
  54. {
  55. GtkBuilder *gtkBuilder;
  56. GtkWidget *window;
  57.  
  58. gtk_init(&argc, &argv);
  59.  
  60. gtkBuilder = gtk_builder_new();
  61.  
  62. gtk_builder_add_from_file(gtkBuilder, "ventana.glade", NULL);
  63.  
  64. window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "ventana1"));
  65.  
  66. label = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "label1"));
  67.  
  68. button = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton1"));
  69. button2 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton2"));
  70. button3 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton3"));
  71. button4 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton4"));
  72.  
  73. //gtk_window_set_title(GTK_WINDOW(window), "Establece título.....");
  74.  
  75. g_signal_connect(GTK_OBJECT(button2),"clicked",G_CALLBACK(texto_label),NULL);
  76.  
  77. g_object_unref(G_OBJECT(gtkBuilder));
  78. gtk_widget_show(window);
  79.  
  80. gtk_main();
  81.  
  82. return 0;
  83. }
  84.  
  85.  

[MOD] Usar etiquetas GeSHi, para publicar codigo.


Título: Re: Problema con GTK y C
Publicado por: ivancea96 en 27 Julio 2017, 04:54 am
La función letras es incorrecta, el retorno debe ser "char*", no "char". ¿Lo has cambiado?


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 04:54 am
Sorry por las estupideces que escribí en el texto.... a mucho estrés y darle y darle....

A los botones 1, 3 y 4 les eliminé sus funciones....

Básicamente es el botón 2......

si escribo algo como char textFunc[] = "hola soy un texto";

y lo agrego en el label.... de esta manera  

gtk_label_set_text(GTK_LABEL(label), textFunc);

Funciona....

Pero de ninguna manera pasa la cadena de la función letras, definida en venta.h y implementada en venta.c


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 04:58 am
La función letras en ventana.c si está comentada.....

la que sirve es la que está implementada en venta.c....

venta.c
Código
  1. #include "venta.h"
  2. //#include <stdio.h>
  3. //#include <stdlib.h>
  4.  
  5. //const char letras(void)
  6. char letras(void)
  7. //char *letras(void)
  8. {
  9. return "Hoy es un gran dia";
  10. // char *textFunc;
  11. // textFunc = "pulga h";
  12. //char textFunc[] = "pulga h";
  13. //return (textFunc);
  14. // return textFunc;
  15. //char a[] = "pulguita";
  16. /*char a;
  17. a = "pulguita";
  18. return a;
  19. */
  20. }
  21.  
  22. /*char letras(void)
  23. {
  24. //return letras = "hello";
  25. letras = "hello";
  26. }*/
  27.  
  28. /*int Suma(int num1, int num2)
  29. {
  30. return (num1 + num2);
  31. }*/
  32.  
  33.  

[MOD] Usar etiquetas GeSHi, para publicar codigo.


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 05:00 am
Voy a probar con char*


Título: Re: Problema con GTK y C
Publicado por: ivancea96 en 27 Julio 2017, 05:04 am
No solo pruebes; entiende el por qué char es incorrecto y char* es correcto  :D


Título: Re: Problema con GTK y C
Publicado por: erikcmauricio en 27 Julio 2017, 05:12 am
Ya probé y funciona..... pero al compilar debo agregar el venta.c para que funcione...... se supone que al incluir el .h en venta.c y ventana.c debería invocarlo......

Si.... buscaré la diferencia entre char y puntero char*..... gracias

Por si le sirve a alguien.....
Código
  1. venta.c
  2. #include "venta.h"
  3. char* letras(void)
  4. {
  5. return "Hoy es un gran dia";
  6. }
  7.  
  8. venta.h
  9. #ifndef VENTA_H_INCLUDED
  10. #define VENTA_H_INCLUDED
  11.  
  12. char* letras(void);
  13.  
  14. #endif
  15.  
  16. ventana.c (este es el .c principal)
  17. #include <gtk/gtk.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include "venta.h"
  21.  
  22. //extern char letras();
  23.  
  24. GtkWidget *label;
  25. GtkWidget *button;
  26. GtkWidget *button2;
  27. GtkWidget *button3;
  28. GtkWidget *button4;
  29. GtkWidget *texto;
  30.  
  31. GtkWidget *labelMsg;
  32. GtkWidget *buttonMsg;
  33.  
  34. GtkWidget *form_msg;
  35. /*char letras(void)
  36. {
  37. //return("Eres un playo");
  38. char textFunc[] = "pulga h";
  39. return(textFunc);
  40. }*/
  41.  
  42. void texto_label(void)
  43. {
  44. //char text[] = letras();
  45. //text = letras();
  46. //gchar b;
  47. //b = text;
  48. //b=text;
  49.  
  50. //char b[] = letras();
  51. //text = letras(void);
  52. //text == "pulga";
  53. //gtk_label_set_text(GTK_LABEL(label), "Hola guineo plátano");
  54. //gtk_label_set_text(GTK_LABEL(label), letras());// cierra la ventana
  55. //gtk_label_set_text(GTK_LABEL(label), letras(void));//error
  56.  
  57. //da error.... dice que letras no definido
  58. //gtk_label_set_text(GTK_LABEL(label), letras());
  59.  
  60. char* text;
  61. text = letras();
  62. gtk_label_set_text(GTK_LABEL(label), text);
  63.  
  64.  
  65. }
  66.  
  67. int main(int argc, char *argv[])
  68. {
  69. GtkBuilder *gtkBuilder;
  70. GtkWidget *window;
  71.  
  72. gtk_init(&argc, &argv);
  73.  
  74. gtkBuilder = gtk_builder_new();
  75.  
  76. gtk_builder_add_from_file(gtkBuilder, "ventana.glade", NULL);
  77.  
  78. window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "ventana1"));
  79.  
  80. label = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "label1"));
  81.  
  82. button = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton1"));
  83. button2 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton2"));
  84. button3 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton3"));
  85. button4 = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Boton4"));
  86.  
  87. //gtk_window_set_title(GTK_WINDOW(window), "Establece título.....");
  88.  
  89. g_signal_connect(GTK_OBJECT(button2),"clicked",G_CALLBACK(texto_label),NULL);
  90.  
  91. g_object_unref(G_OBJECT(gtkBuilder));
  92. gtk_widget_show(window);
  93.  
  94. gtk_main();
  95.  
  96. return 0;
  97. }
  98.  
  99.  


[MOD] Usar etiquetas GeSHi, para publicar codigo.



Si lo compilo de esta manera.... dice lo siguiente.... se supone que debería incluir venta.c... pero no lo hace.....

root@erikc-Aspire-4560:/home/erikc/Documentos/ventana-2# gcc -Wall -g -o ventana ventana.c `pkg-config --cflags --libs gtk+-2.0` -export-dynamic
In file included from ventana.c:4:0:
venta.h:12:7: warning: extra tokens at end of #endif directive
 #endif
       ^
/tmp/cc9fBUWP.o: En la función `texto_label':
/home/erikc/Documentos/ventana-2/ventana.c:45: referencia a `letras' sin definir
collect2: error: ld returned 1 exit status

Si lo incluyo manualmente.... funciona.....

root@erikc-Aspire-4560:/home/erikc/Documentos/ventana-2# gcc -Wall -g -o ventana ventana.c venta.c `pkg-config --cflags --libs gtk+-2.0` -export-dynamic
In file included from ventana.c:4:0:
venta.h:12:7: warning: extra tokens at end of #endif directive
 #endif
       ^
In file included from venta.c:1:0:
venta.h:12:7: warning: extra tokens at end of #endif directive
 #endif

[MOD] No efectuar doble post, se usa botón "modificar" para añadir comentarios.


Título: Re: Problema con GTK y C
Publicado por: simorg en 27 Julio 2017, 05:25 am
@erikcmauricio

Hola, se ruega leer las Reglas del Foro.

No se hace doble post, se usa "modificar" para añadir comentarios.

Para publicar codigo es imprescindible usar las etiquetas GeSHi.


Tenlo presemte. Yá te he modificado demasiadas cosas.

En mi firma tienes las Reglas.


Saludos.


Título: Re: Problema con GTK y C
Publicado por: ivancea96 en 27 Julio 2017, 14:06 pm
Dentro de ventana.c tienes un include de venta.h. venta.h no tiene ninguna vinculación a venta.c. Al hacer ese include, lo único que hace es "copiar el código de venta.h e incrustarlo donde tenías el include". Es decir, lo único que logras es que "exista" la función letras, por lo cual la puedes usar sin problemas, pero NO existe su definición (la que está dentro de venta.c).

Este error:
Código:
referencia a `letras' sin definir
Estás suando letras(), pero no encuentra su definición, así que te da el error.
Su definición está en venta.c.