From rabrantes82 at gmail.com  Sun Sep  4 21:54:44 2005
From: rabrantes82 at gmail.com (rabrantes82@gmail.com)
Date: Sun,  4 Sep 2005 21:54:44 +0200 (CEST)
Subject: [Rd] .Call with C and Fortran together (PR#8122)
Message-ID: <20050904195444.15D49CBFC@slim.kubism.ku.dk>

Full_Name: Ricardo Luiz de Andrade Abrantes
Version: 2.1.1
OS: Debian Linux, kernel 2.6.8
Submission from: (NULL) (201.6.83.153)


The problem can be well explained with the following example:
Suppose I made a program in fortran, and a C interfacece to it. Now I want to
use this C interface in R to call my fortran program. Then I modified my C file
to deal with SEXPs and compile it as a shared lib. Look at the files:

File: prog.f
-------------
      subroutine cg()
      write(*,*) 'Just a simple test'
      end

      subroutine program()
      write(*,*) 'Calling the function...'
      call cg()
      end

File test.h
------------
#include "cfortran.h"

PROTOCCALLSFSUB0(PROGRAM,program)
#define program() CCALLSFSUB0(PROGRAM,program)


File test.c
------------
#include <R.h>
#include <Rdefines.h>
#include <stdio.h>

SEXP simple_program(){
  program();
  return R_NilValue;
}


I compile the C and Fortran souces into a shared lib, open R, do a
dyn.load("lib's name") and then a .Call("simple_program").
What I got?
Calling the function...
Segmentation fault

What if I change the cg function's name to pp? My Fortran code is now:

File: prog.f
-------------
      subroutine pp()
      write(*,*) 'Just a simple test'
      end

      subroutine program()
      write(*,*) 'Calling the function...'
      call pp()
      end

And the output from R is:

 Calling the function...
 Just a simple test
NULL

In some machines I don't get the segmentation fault problem, but I don't get the
message "Just a simple test" either (when using "cg" as the subroutine's name).
I believe this is bug in R because if I change my C interface again to return a
0 instead of a R_NilValue, and then use it with another C program wich loads the
dynamic library amd call the function simple_program(), everything work
perfectly.


   Thanks,


         Ricardo



[Rd] .Call with C and Fortran together (PR#8122)
rabrantes82@gmail.com