G'day Remko, On Mon, 25 Oct 2010 15:33:30 +1100 Remko Duursma <remkoduur...@gmail.com> wrote:
> apologies if this is somewhere in a manual, I have not been able to > find anything relevant. You probably have to set some appropriate flags and the information should be somewhere in the manual of your compiler. Though, "Writing R Exensions" will tell you now to change/specify flags for compilers. > I run Windows Vista. My condolences. :) > But is it possible to have more than one subroutine in my source file, > one depending on the other? Yes. > I.e, my code looks something like this: > > subroutine f(x,y,z) > > call g(x,y,z) > > end > > subroutine g(x,y,z) > > z = x*y > > end > > calling this from R shows that subroutine g is not called. What do you mean with "g is not called"? How did you assert this? If the code functions correctly, then g has to be called, either explicitly or implicitly (e.g. if it was inlined). Do you mean that when you compile the code and load the resulting DLL from R, you can only call subroutine f via .Fortran but not subroutine g? > The code compiled as executable works fine. What do you mean with "compiled as executable"? The snippet that you showed would not compile as an executable as there is no main program. So what do you mean with "works fine"? That you can call the subroutine g from the main program that you use when creating an executable? My guess, based on this snippet, is that your compiler notices that subroutine g is not really needed and replaces the call to g within f by the body of g and does not create a separate entry point for g in the compiled object; a process known as in-lining (IIRC) and typically used by compilers if high levels of optimisations are requested. The compiler does not know that you intend to call g later directly from R via .Fortran, all it sees is the code in the file and, if high optimisation is requested, it may feel free to rearrange the code to stream-line it (e.g. by in-lining). So possible solutions could be: 1) ask for a lower level of optimisation 2) tell the compiler not to do in-lining (flag --no-inline??) 3) put the routines into separate files, compile the files separately and then link all the resulting object files together into a DLL. AFAIK, optimising/inlining across separate files is a tricky issue so few, if any, compilers would do so. 4) Check whether there is an option to specify which exportable symbols have to be in the DLL in the end. Cheers, Berwin ========================== Full address ============================ Berwin A Turlach Tel.: +61 (8) 6488 3338 (secr) School of Maths and Stats (M019) +61 (8) 6488 3383 (self) The University of Western Australia FAX : +61 (8) 6488 1028 35 Stirling Highway Crawley WA 6009 e-mail: ber...@maths.uwa.edu.au Australia http://www.maths.uwa.edu.au/~berwin ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.