Skip to content

I can't make .C(...) web-page example.

5 messages · Ricardo Zorzetto Nicoliello Vencio, Uwe Ligges, Peter Dalgaard +1 more

#
Hi everyone!

I'm trying to lear how to call external C code in R but even the R help
web-page example is drive me crazy.

I copy-paste the example at:

http://stat.ethz.ch/R-manual/R-patched/doc/manual/R-exts.html#Interface%20functions%20.C%20and%20.Fortran

here is the example:

void convolve(double *a, int *na, double *b, int *nb, double *ab)
{
  int i, j, nab = *na + *nb - 1;

  for(i = 0; i < nab; i++)
    ab[i] = 0.0;
  for(i = 0; i < *na; i++)
    for(j = 0; j < *nb; j++)
      ab[i + j] += a[i] * b[j];
}

called from R by

conv <- function(a, b)
  .C("convolve",
     as.double(a),
     as.integer(length(a)),
     as.double(b),
     as.integer(length(b)),
     ab = double(length(a) + length(b) - 1))$ab


but using the conv function in simple examples give me trouble:
Error in conv(1:10, 2:11) : pairlist object cannot be coerced to double
Segmentation fault
Error in conv(c(10.53, 8.456, 6.6), c(10.53, 8.456, 6.6)) :
        cannot allocate vector of length 1717986918
Error in conv(a, b) : cannot coerce type promise to double vector


and so on.

These results appear if I have only the .c file or if I use gcc -c conv.c
to create .o file. I cannot create executable because there is no
main(...) in .c file but just the copy-pasted example.


Someone knows what is happening to me ?
#
Change the name.  There is a convolve C function in R 1.8.x (but not
R-devel) that is being found rather than yours.
On Sun, 1 Feb 2004, Ricardo Zorzetto Nicoliello Vencio wrote:

            

  
    
#
Ricardo Zorzetto Nicoliello Vencio wrote:

            
>
Most easily, use the R wrapper to compile and link files as in:

R CMD SHLIB convolve.c
which produces an .so file you can dyn.load().
(If you are on Windows: Rcmd SHLIB makes a dll.)

Uwe Ligges
#
Ricardo Zorzetto Nicoliello Vencio <rvencio at ime.usp.br> writes:
Looks like you haven't quite understood how to generate a shared
library (R CMD SHLIB) and load it dynamically (dyn.load), and then
somehow pick up a different convolve entry point (doesn't seem
possible with Linux, but you're not tellig us what your system is...).
Either that or you managed to confuse R badly through some earlier
attempts to load the module.
#
On 1 Feb 2004, Peter Dalgaard wrote:

            
There is an entry point convolve in package ts which is nowadays loaded by
default.  A week or so ago that one was being found under Windows even
after dynamically loading convolve.dll, so I renamed it in R-devel.  I got
the first error message listed above with that example.

If you try another name (convolve1, for example) it should either work or 
report that the symbol cannot be found, hence my suggestion to use another 
name.