[C con Clase] puntero a una funcion
Jorge Medina
jorge en bsdchile.cl
Mar Dic 23 18:02:31 CET 2008
hola lista
Tengo un problemita con un puntero a una funcion, lo que sucede es que
la funcion hace su trabajo pero el puntero donde espero el resultado a
un blocke de memoria allocada no obtiene la referencia;
la funcion es la siguiente:
char *mdb_sql(char *sql,char *val)
{
static char *buf;
int len;
if (sql != NULL && val != NULL)
len = strlen(sql)+strlen(val)+sizeof(char);
buf = (char *)malloc(len);
if(buf != NULL)
snprintf(buf,len,sql,val);
else
perror("mdb_strcat no memory");
return buf;
}
la llamada es la siguiente:
setNewState = mdb_sql("UPDATE empleado SET estado_id = 1
WHERE empleado_id = %s",PQgetvalue(res,i,0));
if (setNewState == NULL)
continue;
if ( PQresultStatus(PQexec(c,setNewState)) !=
PGRES_COMMAND_OK ) { // es aqui donde se me cae el programita y la
variable setNewState esta completamente sin referencia
fprintf(stderr,"Failed Update user: %s",PQgetvalue(res, i, 1));
}
eh aqui la traza:
Breakpoint 1, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
src/util.c:49
49 if (cfgsql != NULL && val != NULL)
(gdb) continue
Continuing.
Breakpoint 2, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
src/util.c:50
50 len = strlen(cfgsql)+strlen(val)+sizeof(char);
(gdb) continue
Continuing.
Breakpoint 3, mdb_sql (cfgsql=0x8014288c5
"gelatos.cl/istegmaier/Maildir", val=0x39 <Error reading address 0x39:
Bad address>) at src/util.c:51
51 buf = (char *)malloc(len);
(gdb) continue
Continuing.
Breakpoint 4, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
src/util.c:52
52 if(buf != NULL)
(gdb) continue
Continuing.
Breakpoint 5, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
src/util.c:53
53 snprintf(buf,len,cfgsql,val);
(gdb) continue
Continuing.
Breakpoint 8, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
src/util.c:57
57 }
(gdb) p buf
$8 = 0x801408040 "UPDATE empleado SET estado_id = 1 WHERE empleado_id = 2277"
(gdb) continue
Continuing.
Breakpoint 9, findNewAcounts () at src/mdbuilder.c:118
118 if ( PQresultStatus(PQexec(c,setNewState)) !=
PGRES_COMMAND_OK ) {
(gdb) continue
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x000000080093f572 in strlen () from /lib/libc.so.7
Cualquier sugerencia gracias;
--
Jorge Andrés Medina Oliva.
Más información sobre la lista de distribución Cconclase