Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Drewermerc en 27 Febrero 2014, 16:38 PM

Título: como conectar mysql en c usando gtk
Publicado por: Drewermerc 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.
Título: Re: como conectar mysql en c usando gtk
Publicado por: eferion 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.
Título: Re: como conectar mysql en c usando gtk
Publicado por: Drewermerc en 27 Febrero 2014, 17:03 PM
hola eferion.
bueno mira pues aqui esta el codigo que intente hacer.


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


esta es una segunda forma de como lo quise hacer pero no tampoco me funciono.

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


bueno espero que me puedas ayudar y gracias por tu respuesta.
Título: Re: como conectar mysql en c usando gtk
Publicado por: eferion 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...


conn = mysql_init(NULL);
if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))



ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJET(ventana), "delete_event")



etiqueta = gtk_label_new( "error");
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.


MYSQL *conn;
MYSQL_RES *res;
GtkWidget *ventana;


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


void consulta (MYSQL *conn, MYSQL_RES *res, MYSQL_ROW row)
{
   if (mysql_query(conn, "SELECT * FROM datos"))
      fprintf(stderr, "%s\n", mysql_error(conn));
   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.
Título: Re: como conectar mysql en c usando gtk
Publicado por: Drewermerc 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.
Título: Re: como conectar mysql en c usando gtk
Publicado por: Drewermerc 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.


g_signal_connect(G_OBJET(ventana), "delete_event")
G_CALLBACK((delete_event), NULL);

en realida iba asi


g_signal_connect(G_OBJET(ventana), "delete_event",  G_CALLBACK(delete_event), NULL);


y bueno pues gracias eferion por contestar.