Debes pasar a la función un argumento adicional en el cual puedas devolver a quien llama a la función ese valor.
Me explico:
Tienes una función "f" que devuelve un tipo de dato "cualquier_tipo" (int, char, o cualquiera). Esta función f tiene un total de "n" argumentos [0 ≤ n ≤ (máximo - 1 número de argumentos que permita el lenguaje pasar a una función)].
Deberás adicionar un argumento a f para que puedas "devolverlo" a quien use la función. La característica de este nuevo argumento es que deberá ser un puntero o apuntador, para que su valor se pueda modificar o asignar dentro de la función f y para que además al terminar f y volver a quien la llama se conserve dicho valor.
Ejemplo de lo anterior, si f no tiene argumentos (solo el que se va a usar para retornar el valor adicional):
cualquier_tipo f(tipo * para_retornar);
{
... código ...
... más código ...
asignas o cambias el valor del argumento "para_retornar":
para_retornar = valor_de_ tipo_"tipo";
... código ...
return (valor_de_tipo_ "cualquier_tipo");
}
En el programa, cuando se vaya a llamar a f, se hace así:
{
tipo otro_valor; /* variable a usar para recibir el segundo valor de f */
cualquier_tipo resultado_de_f; /* variable para recibir el valor de f */
...código...
resultado_de_f = f( &otro_valor );
/* aquí ya tenemos los dos valores obtenidos de haber usado la función f */
... código ...
}
Lo anterior se puede extender para que una función retorne más de 2 valores, ya sean 3, 4, o más. El límite, como dije antes, es que se debe respetar el máximo número de argumentos que puede tener una función.