Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema de memoria con mysql en c

Estas en el tema de problema de memoria con mysql en c en el foro de C/C++ en Foros del Web. Hola estoy haciendo un programa en c que se conecta a una base de datos mysql, y tengo un problema cuando recojo las filas de ...
  #1 (permalink)  
Antiguo 11/11/2010, 09:30
 
Fecha de Ingreso: noviembre-2007
Mensajes: 21
Antigüedad: 16 años, 5 meses
Puntos: 0
problema de memoria con mysql en c

Hola estoy haciendo un programa en c que se conecta a una base de datos mysql, y tengo un problema cuando recojo las filas de la consulta, os lo explico, primero pongo el código:


Código:
#include <iostream>
#include <mysql.h>

using namespace std;

int main(int argc, char** argv) {

    MYSQL *conexion;
    MYSQL_RES *result;
    MYSQL_ROW row;
    //MYSQL_FIELD *fields;
    
    unsigned int num_fields=0,i=0;
    my_ulonglong num_rows;
    const char *consulta = "SELECT id,name,phone,email FROM users";

    conexion = mysql_init(NULL);
    if (!mysql_real_connect(conexion, "iphost", 
	"user", "pass", "database", 0, NULL, 0)){
        cout<<stderr<<" Failed to connect to database: Error: ";
        cout<<endl<<mysql_error(conexion);
    }
    //if (mysql_real_query(conexion, consulta,strlen(consulta))!=0){
    if (mysql_query(conexion, consulta)!=0){
        cout<<"Error: mysql_real_query ha fallado en la consulta:"
	cout<<consulta<<endl;
    }
    result = mysql_store_result(conexion);
    if (result){ //Hay filas que devolver
        num_fields = mysql_field_count(conexion);
        num_rows = mysql_num_rows(result);
        while(i<25){
            i++;
            cout<<i<<endl;
        }
        int j=0;
        while(row = mysql_fetch_row(result)){
            j++;
            cout<<"La fila es "<<j<<endl;
        }
        while(i<50){
            i++;
            cout<<i<<endl;
        }
           
        mysql_free_result(result);
    }
    else {
        if (mysql_errno(conexion)){
           cout<<stderr<<"Error: "
           cout<<mysql_error(conexion)<<endl;
        }
        else if (mysql_field_count(conexion) == 0){
            // El query no ha devuelto nada
            cout<<"El query no ha devuelto nada";
        }

    }
    
    mysql_close(conexion);
    
    return 0;
    
}


y el código de salida es:


Código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
La fila es 4199291
La fila es 2280744
La fila es 1628938179
La fila es 1629738798
La fila es 1629738792
La fila es 1629738793
La fila es 1629738794
/cygdrive/C/Program Files/NetBeans 6.9.1/ide/bin/nativeexecution/dorun.sh: line
33:  4068 Segmentation fault      (core dumped) sh "${SHFILE}"
Press [Enter] to close the terminal ...
tengo un problema en la línea while (row = mysql_fetch_row(result))
pero no entiendo que le puede pasar para que me haga eso con la variable j, que es un simple entero, estoy desquiciado, necesitro vuestra ayuda!!

Muchas gracias
  #2 (permalink)  
Antiguo 12/11/2010, 01:51
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: problema de memoria con mysql en c

El fallo es que en esa línea estás asignando a row el valor de mysql_fetch_row(result), en lugarde hacer una comparación. Al tratarse de una comparación de igualdad, hay que emplear == (supongo que ha sido un error de mecanografía). El resultado booleano de una asignación es siempre TRUE, con lo que en ese bucle la condición del while siempre es verdadera, y el valor de j se te incrementará hasta quién sabe cuanto. El error que te da indica que estás intentando acceder a una dirección de memoria no válida.
  #3 (permalink)  
Antiguo 15/11/2010, 01:48
 
Fecha de Ingreso: noviembre-2007
Mensajes: 21
Antigüedad: 16 años, 5 meses
Puntos: 0
Pregunta Respuesta: problema de memoria con mysql en c

row = mysql_fetch_row(result) tiene que ser así, una asignación, porque necesito que row almacene la fila (actual) de una consulta que te devuelve 105 filas, y con el bucle las debería de recorrer todas, de todas formas gracias !!

Aún no he encontrado la solución, no es por el bucle, si lo quito y pongo:
row = mysql_fetch_row(result); esta línea 5 o 6 veces se desborda la memoria igual, no entiendo que le pasa

Muchas gracias
  #4 (permalink)  
Antiguo 22/11/2010, 06:54
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: problema de memoria con mysql en c

Te vuelvo a repetir lo de antes: Lo que tienes como condición en ese bucle while es una asignación, cuyo resultado lógico es siempre TRUE. Si necesitas esa asignación, tendrías que hacerla dentro del bucle y buscar otra condición de control. No he manejado SQL, pero ese error, si no te viene del bucle, se generará dentro de la librería mysql, o sea, probablemente estarás haciendo algo mal con esa librería.

Etiquetas: memoria, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:36.