Tema: c y postgres
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 23/04/2015, 05:43
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: c y postgres

Tienes un pequeño fallo de concepto.

"conexion", es un puntero. Esto quiere decir que cualquier cambio que hagas en la posición de memoria "apuntada" por esta variable se va a ver reflejado fuera de la función. PERO si dentro de la función haces que el puntero apunte a otra dirección de memoria... lo siento, este cambio no se va a ver reflejado fuera de la función.

Un ejemplo:

Código C:
Ver original
  1. void SiCambia( int* numero )
  2. {
  3.   *numero = 2;
  4. }
  5.  
  6. void NoCambia( int* numero );
  7. {
  8.   int temp;
  9.   numero = &temp;
  10.   *numero = 4;
  11. }
  12.  
  13. int main( )
  14. {
  15.   int numero = 0;
  16.   printf( "%d\n", numero );
  17.   SiCambia( &numero );
  18.   printf( "%d\n", numero );
  19.   NoCambia( &numero );
  20.   printf( "%d\n", numero );
  21. }

Como puedes ver, en la función "NoCambia" estoy cambiando la dirección del puntero y este cambio no se va a ver reflejado fuera. Este cambio es local y pertenece únicamente a la función.

Si quieres modificar una variable dentro de una función pasándola como argumento lo que haces es usar un puntero simple, luego si lo que buscas es modificar un puntero... tienes que preparar la función para que reciba un puntero doble. Si quieres modificar un puntero doble ... necesitarás un puntero triple... y te puedes imaginar el resto de la secuencia.

Con esto, tu función tendría que quedar tal que:

Código C:
Ver original
  1. int  Conexion_BD (char *dirIp, char *nombre_bd, char *usuario, char *password, PGconn **conexion )
  2. {
  3.   PGresult *res;
  4.   int vvuelta;
  5.   *conexion = PQsetdbLogin(dirIp,"5432",NULL,NULL,nombre_bd,usuario,password);
  6.  
  7.   if (PQstatus(*conexion) != CONNECTION_BAD)
  8.     return 1;
  9.   else {
  10.     PQfinish(*conexion);
  11.     return 0;
  12.   }
  13. }

El resto de argumentos no neces
Obviamente tienes que modificar también el código que llama a la función, pero de esta forma consigues que los cambios en el puntero se vean reflejados fuera de la función.