Hello there!
I almost don't deal with SEXPs. The function's name is main() it returns a 
SEXP wich is R_NilValue, thats all I use of SEXPs. This function call an 
optimization packge and the output goes all to a text file.
Well, I followed Mr. Lumley's hint and used gdb with R and my program. 
Together with a friend we could find the problem.
Inside the Fortran optimization package there's a subroutine called cg(...), 
and for some wierd reason this subroutine is never called (so, some 
variables are not correctly initialized) and the program becomes crazy.
I did this small example to show you what happens:

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>
#include "test.h"


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


I compile the C and Fortran souces into a shared lib. I 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

Can anyone explain this? Is there a way to solve it? The optimization 
package I use has the "cg" function, and I cannot change it's name!


Thanks,


Ricardo



On 8/31/05, Huntsinger, Reid <reid_huntsinger@merck.com> wrote:
> 
> I suggest you look at the code for .Call() in dotcode.c. I suspect the
> problem is in dealing with R objects, however. You don't show how you get
> from SEXPs to pointers to pass to Fortran, or what the Fortran routine
> requires.
> 
> I don't understand how you can call the "same" function from C. How do you
> deal with SEXPs?
> 
> Reid Huntsinger
> 
> Reid Huntsinger
> -----Original Message-----
> From: r-devel-bounces@r-project.org [mailto:r-devel-bounces@r-project.org]
> On Behalf Of Ricardo Luiz Andrade Abrantes
> Sent: Tuesday, August 30, 2005 4:33 PM
> To: r-devel@r-project.org
> Subject: Re: [Rd] .Call and Segmentation Fault
> 
> 
> Hello to everybody!
> After reading all the C code, checking for problems, and find nothing, I
> decided something a little bit different...
> If my ".so" library works in a wrog way in R it should do the same in C. 
> So
> I created a C program that loads my library file and the executes the same
> function R is executing.
> The program worked perfectly! In fact I changed two things in my library:
> The function I call now return an int, not a SEXP, and the return value is 
> 0
> 
> not R_NilValue.
> Valgrind's output is ok too...
> If .Call has no problems, and if my function works perfect when called 
> from
> a C program, where the problem lies? Why my program becomes "crazy" when I
> run it from R?
> I would apreciate very much your help! I don't where else I could find 
> help
> on this.
> I can provide any piece of code that may help, Its just ask!
> 
> 
> Thanks,
> 
> 
> Ricardo
> 
> 
> 
> On 8/28/05, Prof Brian Ripley <ripley@stats.ox.ac.uk> wrote:
> >
> > On Sat, 27> dyn.load("libtest.so")
> > .Call("simple_program")
> Calling the function...
> Falha de segmentação
> Aug 2005, Ricardo Luiz Andrade Abrantes wrote:
> >
> > > Hi!
> > > Yes, I am returning a SEXP from the functions called from R, and the
> > > problem occurs before (thousands of iterations before) the return
> > > point.
> > > In fact I runned valgrind into R and when I call ".Call(...) " I got
> > > many errors like:
> > > ==4324== Use of uninitialised value of size 8
> > > ==4324== at 0x1CB0766D: tnls_ (gencan.f:4101)
> > > ==4324== by 0x1CB01962: gencan_ (gencan.f:1876)
> > > ==4324== by 0x1CAFECA5: easygencan_ (gencan.f:440)
> > > ==4324== by 0x1CB0B47D: algencan_ (algencan.f:517)
> > > ==4324== by 0x1CB09E74: easyalgencan_ (algencan.f:76)
> > > ==4324== by 0x1CAFE5B3: main (algencanma.c:808)
> > > what does not happens when I compile the algencanma as a regular
> > > program (not a library) and run it from shell. Valgrind does not find
> > > anything wrong when I run the program directly, except 2 missing
> > > free() calls.
> > > Do you have any ideas where the problem lies (R .Call function or C
> > program)?
> >
> > It cannot be .Call: your .Call passed no parameters so there was nothing
> > to be uninitialized. I did ask you why you were doing that.
> >
> > .Call is very heavily tested in lots of R applications, so the prior
> > probability of innocence must be very high.
> >
> > --
> > Brian D. Ripley, ripley@stats.ox.ac.uk
> > Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> > University of Oxford, Tel: +44 1865 272861 (self)
> > 1 South Parks Road, +44 1865 272866 (PA)
> > Oxford OX1 3TG, UK Fax: +44 1865 272595
> >
> 
> [[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 
> 
> 
> 
> 
> ------------------------------------------------------------------------------
> Notice: This e-mail message, together with any attachments...{{dropped}}

