como conectar mysql en c usando gtk

Iniciado por Drewermerc, 27 Febrero 2014, 16:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Drewermerc

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.

eferion

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.

Drewermerc

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.

eferion

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.

Drewermerc

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.

Drewermerc

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.