elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  como conectar mysql en c usando gtk
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: como conectar mysql en c usando gtk  (Leído 3,443 veces)
Drewermerc

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
como conectar mysql en c usando gtk
« en: 27 Febrero 2014, 16:38 pm »

Hola a todos.
buen es que apenas me inicie en la programacion de api's en c usando gtk y bueno como se manejar mysql con c sin api's pues quise ver si era el mismo metodo usando gtk pero no pude me dise violacion del segmento a la hora de ejecutar el programa y estuve buscando informacion para tan solo poder hacer la conexion pero no e encontrado nada, bueno queria saber si me podria ayudar o orientar como le podria hacer para hacer o de algun tutoria que me pueda ayudar y bueno espero que me puedan ayudar.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: como conectar mysql en c usando gtk
« Respuesta #1 en: 27 Febrero 2014, 16:45 pm »

Así de primeras veo que tienes un problema en la línea 258, debajo del comentario del if... no estás inicializando el puntero...

Más o menos eso es lo que te podría decir si tuviese acceso a la parte conflictiva del código... pero va a ser que con lo que aportas poco te puedo decir.


En línea

Drewermerc

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: como conectar mysql en c usando gtk
« Respuesta #2 en: 27 Febrero 2014, 17:03 pm »

hola eferion.
bueno mira pues aqui esta el codigo que intente hacer.

Código
  1.  1 #include <stdio.h>
  2.  2 #include <stdlib.h>
  3.  3 #include </usr/include/mysql/mysql.h>
  4.  4 #include <gtk/gtk.h>
  5.  5 #define server "localhost"
  6.  6 #define user "root"
  7.  7 #define password ""
  8.  8 #define database "datos"
  9.  9 void consulta(MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row);
  10. 10 void hello(GtkWidget *Widget, gpointer data);
  11. 11 gint delete_event (GtkWidget *Widget, GdkEvent *event , gpointer data);
  12. 12 void destroy(GtkWidget *widget, gpointer data);
  13. 13 int main (int argc, char *argv[])
  14. 14 {
  15. 15    MYSQL *conn;
  16. 16    MYSQL_RES *res;
  17. 17    MYSQL_ROW row;
  18. 18    GtkWidget *ventana;
  19. 19    int wich;
  20. 20    GtkWidget * etiqueta;
  21. 21    res=0;
  22. 22    row=0;
  23. 23    wich = atoi(argv[1]);
  24. 24
  25. 25    conn = mysql_init(NULL);
  26. 26    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
  27. 27             fprintf(stderr, "%s\n",mysql_error(conn));
  28. 28    consulta(conn, res, row);
  29. 29    mysql_free_result(res);
  30. 30    mysql_close(conn);
  31. 31       gtk_init(&argc, &argv);
  32. 32  
  33. 33    
  34. 34       ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  35. 35       g_signal_connect(G_OBJET(ventana), "delete_event")
  36. 36       G_CALLBACK((delete_event), NULL);
  37. 37       G_CALLBACK((destroy), NULL);
  38. 38       gtk_container_set_border_with(GTK_CONTAINER(ventana), 10);
  39. 39      
  40. 40       etiqueta = gtk_label_new( "error");
  41. 41       gtk_container_add (GTK_CONTAINER(ventana), etiqueta);
  42. 42      
  43. 43       gtk_widget_show(ventana);
  44. 44       gtk_widget_show(etiqueta);
  45. 45    
  46. 46       gtk_main();
  47. 47    return 0;
  48. 48 }
  49. 49
  50. 50 void consulta (MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row)
  51. 51 {
  52. 52    if (mysql_query(conn, "SELECT * FROM datos"))
  53. 53       fprintf(stderr, "%s\n", mysql_error(conn));
  54. 54    res = mysql_use_result(conn);
  55. 55    printf("id\t nombre\tedad\n");
  56. 56    while ((row = mysql_fetch_row(res)) != NULL)
  57. 57       printf("%s\t%s\t%s\t\n", row[0], row[1], row[2]);
  58. 58 }
  59. 59 void hello (GtkWidget *widget, gpointer data)
  60. 60 {
  61. 61    g_print("hola mundo \n");
  62. 62 }
  63. 63 gint delete_event (GtkWidget *Widget, GdkEvent *event , gpointer data)
  64. 64 {
  65. 65     g_print("delete_event\n");
  66. 66
  67. 67    return TRUE;
  68. 68 }
  69. 69 void destroy(GtkWidget *widget, gpointer data)
  70. 70 {
  71. 71    gtk_main_quit();
  72. 72 }
  73.  

esta es una segunda forma de como lo quise hacer pero no tampoco me funciono.
Código
  1.   1 #include <stdio.h>
  2.  2 #include <stdlib.h>
  3.  3 #include </usr/include/mysql/mysql.h>
  4.  4 #include <gtk/gtk.h>
  5.  5 #define server "localhost"
  6.  6 #define user "root"
  7.  7 #define password ""
  8.  8 #define database "datos"
  9.  9 void consulta(MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row);
  10. 10 void hello(GtkWidget *Widget, gpointer data);
  11. 11 gint delete_event (GtkWidget *Widget, GdkEvent *event , gpointer data);
  12. 12 void destroy(GtkWidget *widget, gpointer data);
  13. 13 int main (int argc, char *argv[])
  14. 14 {
  15. 15    MYSQL *conn;
  16. 16    MYSQL_RES *res;
  17. 17    MYSQL_ROW row;
  18. 18    GtkWidget *ventana;
  19. 19    int wich;
  20. 20    GtkWidget * etiqueta;
  21. 21    res=0;
  22. 22    row=0;
  23. 23    wich = atoi(argv[1]);
  24. 24
  25. 25    conn = mysql_init(NULL);
  26. 26    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
  27. 27             fprintf(stderr, "%s\n",mysql_error(conn));
  28. 28    consulta(conn, res, row);
  29. 29    mysql_free_result(res);
  30. 30    mysql_close(conn);
  31. 31       gtk_init(&argc, &argv);
  32. 32    if (wich == 1)
  33. 33    {
  34. 34       ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  35. 35       g_signal_connect(G_OBJET(ventana), "delete_event")
  36. 36       G_CALLBACK((delete_event), NULL);
  37. 37       G_CALLBACK((destroy), NULL);
  38. 38       gtk_container_set_border_with(GTK_CONTAINER(ventana), 10);
  39. 39      
  40. 40       etiqueta = gtk_label_new( "error");
  41. 41       gtk_container_add (GTK_CONTAINER(ventana), etiqueta);
  42. 42      
  43. 43       gtk_widget_show(ventana);
  44. 44       gtk_widget_show(etiqueta);
  45. 45    }  
  46. 46       gtk_main();
  47. 47    return 0;
  48. 48 }
  49. 49
  50. 50 void consulta (MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row)
  51. 51 {
  52. 52    if (mysql_query(conn, "SELECT * FROM datos"))
  53. 53       fprintf(stderr, "%s\n", mysql_error(conn));
  54. 54    res = mysql_use_result(conn);
  55. 55    printf("id\t nombre\tedad\n");
  56. 56    while ((row = mysql_fetch_row(res)) != NULL)
  57. 57       printf("%s\t%s\t%s\t\n", row[0], row[1], row[2]);
  58. 58 }
  59. 59 void hello (GtkWidget *widget, gpointer data)
  60. 60 {
  61. 61    g_print("hola mundo \n");
  62. 62 }
  63. 63 gint delete_event (GtkWidget *Widget, GdkEvent *event , gpointer data)
  64. 64 {
  65. 65     g_print("delete_event\n");
  66. 66
  67. 67    return TRUE;
  68. 68 }
  69. 69 void destroy(GtkWidget *widget, gpointer data)
  70. 70 {
  71. 71    gtk_main_quit();
  72. 72 }
  73.                                                                                                                                                  69,1        Final
  74.  

bueno espero que me puedas ayudar y gracias por tu respuesta.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: como conectar mysql en c usando gtk
« Respuesta #3 en: 27 Febrero 2014, 17:30 pm »

mysql_init puede devolver null y no lo estás comprobando. Lo mismo te pasa en otras tantas partes del código...

Código
  1. conn = mysql_init(NULL);
  2. if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
  3.  

Código
  1. ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  2. g_signal_connect(G_OBJET(ventana), "delete_event")

Código
  1. etiqueta = gtk_label_new( "error");
  2. gtk_container_add (GTK_CONTAINER(ventana), etiqueta);

Siguiendo con los punteros, lo más normal es inicializarlos al principio para detectar problemas. Tú los tienes sin inicializar, pero esto es una sugerencia.

Código
  1. MYSQL *conn;
  2. MYSQL_RES *res;
  3. GtkWidget *ventana;

MYSQL_RES *res creo que tiene un uso incorrecto aquí:

Código
  1. void consulta (MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row)
  2. {
  3.   if (mysql_query(conn, "SELECT * FROM datos"))
  4.      fprintf(stderr, "%s\n", mysql_error(conn));
  5.   res = mysql_use_result(conn);

Básicamente res es un puntero sí... pero dentro si modificas el valor del puntero dentro de consulta ( ojo, me refiero a la dirección de memoria apuntada por res ), necesitas pasar a "consulta" un puntero a puntero.

Pasando un puntero simple puedes modificar el contenido de la memoria apuntada por el puntero... pero no puedes hacer que el puntero apunte a otro sitio, ya que esa información no viaja de vuelta al salir de la función.
En línea

Drewermerc

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: como conectar mysql en c usando gtk
« Respuesta #4 en: 27 Febrero 2014, 18:01 pm »

hola eferion.

bueno ya inicie las variables y si no me equivoco lo que me quisiste decir es que en lugar de decirle a la funcion que se recivira como argumento un puntero le dijiera que se resiviria una direccion de memoria en este caso de la variable res osea cambiar "*" por "&" pero me a este error

Unknown database 'datos'
MySQL server has gone away
id   nombre   edad
Violación de segmento (`core' generado)

ya revise la base de datos y la tabla y todo es tambien el nombre  y los datos de la conexion tambien y nose que podria ser  y lo de violacion de segmento me lo da al iniciar el proceso de crear la ventana espero que me peuda ayudar gracias.
En línea

Drewermerc

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: como conectar mysql en c usando gtk
« Respuesta #5 en: 27 Febrero 2014, 18:40 pm »

hola ya encontre el error mi error era que esta poniendo argumentos de una funcion separados
y eran estos.

Código
  1. g_signal_connect(G_OBJET(ventana), "delete_event")
  2. G_CALLBACK((delete_event), NULL);
  3.  
en realida iba asi

Código
  1. g_signal_connect(G_OBJET(ventana), "delete_event",  G_CALLBACK(delete_event), NULL);
  2.  

y bueno pues gracias eferion por contestar.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines