El archivo programa.f es el mismo de la carpeta 1_ProgramaFortran-SubrutinaFortran. El archivo subrutina.c es el mismo de la carpeta 2_ProgramaC-SubrutinaC. El archivo enlace.c permite enlazar el programa Fortran con la funcion C. Nótese que: - En Fortran la transferencia de argumentos se realiza por referencia (excepto en el caso de los argumentos de tipo character). - En C la transferencia de argumentos se realiza normalmente por valor salvo que se indique lo contrario (con el prefijo &), en cuyo caso se realiza por referencia. Se exceptúan los vectores, que se transfieren por referencia (ya que v, v[] y &v[0] son equivalentes). - Los compiladores Fortran no distinguen las mayúsculas de las minúsculas (salvo que contengan una opción de compilación que cambie esta forma de proceder). En particular, el compilador GFortran pasa a minúsculas los nombres de las subrutinas y les añade un guión bajo (carácter "_") al final. En otros compiladores el criterio puede ser diferente (puede que el nombre se pase a mayúsculas o que se añadan o no otros caracteres). - Los compiladores C distinguen las mayúsculas de las minúsculas. El compilador GCC conserva las mayúsculas y minúsculas en los nombres de las funciones. Por ello: - En el programa Fortran la llamada call ProductoEscalar(n,v1,v2,w) se compila de forma equivalente a la llamada desde un programa C productoescalar_(&n, &v1[0], &v2[0], &w); - La función C void ProductoEscalar(int n , double *v1, double *v2, double *w) { ... } se compila tal cual. - Por ello, el programa Fortran no se puede enlazar correctamente con la función C, ya que -- El nombre de la función a la que se llama no coincide con el de la función que recibe. -- El primer argumento se transfiere por referencia y se recibe por valor. Soluciones: 1) Modificar la funcion C, de forma que se defina como void productoescalar_(int *n , double *v1, double *v2, double *w) { ... /* donde antes aparecía la variable "n" ahora habrá que escribir "*n" */ } Puede ser necesario reprogramar la funcion C si en su interior se modifica el valor de *n, ya que de lo contrario se modificará el valor de n en el programa principal. 2) Añadir la función C auxiliar void productoescalar_(int *n , double *v1, double *v2, double *w) { void ProductoEscalar(int, double *, double *, double *); ProductoEscalar(*n, v1, v2, w); } que actuará como enlace entre el programa Fortran y la función C. En esencia, esta función auxiliar recibe los cuatro argumentos (n, v1, v2, w) por referencia y pasa el primero (n) por valor y el resto (v1, v2, w) por referencia a la función C. No será necesario reprogramar la función C aunque en su interior se modifique el valor de n, ya que el valor de n que se recibe será una copia del valor de n en la función de enlace (que es el valor de n en el programa principal).