Función que retorna dos tipos distintos de datos.

Iniciado por samur88, 16 Mayo 2011, 22:58 PM

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

samur88

Saludos.
Una duda que me ha surgido y no consigo resolver, quiero que una función devuelva un 1 en caso de que se haya hecho todo correctamente o un 0 en caso de error, pero a su vez esa función devolverá un puntero de estructura, ¿como puedo solucionar esto? ya que si pongo "return 1" por ejemplo me da error en la conversión de datos.

Un saludo.

El_Java

que la funcion retorne un int (return 1 por ejemplo) y la estructura la devuelves mediante referencia ya sea por punteros o por el simbolo &.

Por referencia directa
Código (cpp) [Seleccionar]
int funcion (tipo_struct &estructura) //Declaracion de la funcion
funcion(estructura) //Modo de uso


Por punteros
Código (cpp) [Seleccionar]
int funcion (tipo_struct *estructura) //Declaracion de la funcion
funcion(&estructura) //Modo de uso


Creo que por punteros era asi, pero no estoy del todo convencido xD

samur88

Gracias por la respuesta, pero creo que estas confundido, lo que tu haces es pasarle un puntero por referencia a la función y que la función retorne un entero.

Lo que yo quiero es que internamente la función según unas condiciones retorne o bien un entero si hay error o una estructura en caso de que todo sea correcto.

Un saludo : D .

Acermax

Tienes que hacerlo como dice El_Java...

Otra cosa sería devolver una estructura con 2 posiciones, donde en una se guarde el int y en otra la estructura, pero eso me parece una chorrada y un lío.

samur88

Muchas gracias, pero hago eso y no me compila, me da error en la conversión , pongo el código a continuación:

pacientes * read_ficP(pacientes *primero){
FILE *fp;
storage infoP;
int a = 1;
pacientes *aux,aux2;

if((fp = fopen("clinicaP.bin","r+b")) == NULL) {printf("Error al abrir el archivo"); return 0;}
fseek (fp, 0L, SEEK_SET);

/* Es mejor usar este fragmento, ya que en caso de fallo de fread, hay menos posibilidades de que se
produzca fallo de segmentación */

  while(1){
   if(fread(&aux2,sizeof(pacientes),1,fp) < 1){fclose(fp); return primero;}
   infoP.dniP = aux2.dni;
   strcpy(infoP.nombreP,aux2.nombre);
   infoP.dniM = aux2.dniM;
   add_nodP(&primero,infoP);
  }
return 1;
}


Un saludo y gracias.

Lx

#5
Que te puedo decir capo :-\ ...

Se supone que si estás cambiado los datos de la estructura por referencia y retornado valores enteros ya no se pone como tipo de la función la estructura, sino simplemente un "int". Así:


int read_ficP(pacientes *primero){
FILE *fp;
storage infoP;
int a = 1;
pacientes *aux,aux2;

if((fp = fopen("clinicaP.bin","r+b")) == NULL) {printf("Error al abrir el archivo"); return 0;}
fseek (fp, 0L, SEEK_SET);

/* Es mejor usar este fragmento, ya que en caso de fallo de fread, hay menos posibilidades de que se
produzca fallo de segmentación */

 while(1){
  if(fread(&aux2,sizeof(pacientes),1,fp) < 1){fclose(fp); return primero;}
  infoP.dniP = aux2.dni;
  strcpy(infoP.nombreP,aux2.nombre);
  infoP.dniM = aux2.dniM;
  add_nodP(&primero,infoP);
 }
return 1;
}


¿Simple?. A veces, cuando uno va aprendiendo más,  se confunde en lo básico  ;).

Sauruxum

A los tiempos que no vuelvo al foro xD.

Si quieres una alternativa puedes tambien sobrecargar la funcion, pero debes estar atento de cuando usas una y cuando usas la otra de modo que el compilador no de errores. Otro problema con esto es que tendras que controlar el error a parte en otro pedazo de codigo.

Aun asi, como te lo han puesto apenas arriba esta perfecto!

Saludos

samur88

Muchísimas gracias por la respuesta, disculpadme igual no me explique bien, la función no recibe el valor por referencia si no por valor, ya que "pacientes *primero" es un puntero a una lista del tipo pacientes que antes he definido, entonces lo que hago es mandar ese puntero por valor a la función y que luego retorne ese puntero.

Igual esto es lo raro que hago que debería simplemente mandar por referencia el puntero y dejarme de retornos, vamos que es una tontería mandar a la función un puntero y devolver el mismo xD.

Muchas gracias Sauruxum, ¿que significa sobrecargar la función?.

Un saludo.

Sauruxum

Sobrecargar una funcion es basicamente ponerle el mismo nombre a funciones que hacen cosas distintas ( por ejemplo que devuelvan tipos distintos o que tomen variados argumentos ), aunque ahora que me doy cuenta quizas digo una tonteria, ya que creo que la sobrecarga solo vale para el C++.
Aun asi, si fuera el caso de hacerlo en C++. te haces una funcion que regrese el estado de error y con el mismo nombre la funcion que devuelva el puntero a estructura y en caso de error devuelva un puntero nulo. No se, si no es con sobrecarga o directamente clases, creo que la de mas arriba funciona adecuadamente si la examinas bien, ya que dupongo que si vas a retornar un puntero a struct, me apostaria a que estas usando alocacion dinamica tambien.

Saludos

samur88

Ya entendí mas o menos jeje, es que de C++ no estoy muy puesto, de todas formas vi mi error, la verdad que si paso una variable por referencia no necesito que la función la retorne, es una tontería hacer eso, así puedo devolver enteros en caso de fallos.

Un saludo y gracias.