[R-pkg-devel] Problem (with complex.h?) under Microsoft Windows

Duncan Murdoch murdoch.duncan at gmail.com
Fri Nov 13 21:36:00 CET 2015


On 13/11/2015 11:24 AM, Pierre Lafaye de Micheaux wrote:
> Dear all,
>
> I created a new version of the package IndependenceTests where I call
> some C and Fortran functions (using the .C() or .Fortran() interface).
> It works perfectly under Linux, with gcc. No problem with R CMD check. I
> would like to upload this package on the CRAN.
>
> But when I first tried to use winbuilder, I got an error with the
> following message:
>
> * installing *source* package 'IndependenceTests' ...
> ** libs
>
> *** arch - i386
> g++  -I"D:/RCompile/recent/R/include" -DNDEBUG
> -I"d:/RCompile/r-compiling/local/local320/include"     -O2 -Wall
> -mtune=core2 -c Cnhat.cpp -o Cnhat.o
> Cnhat.cpp:9:89: error: 'complex' has not been declared
> Cnhat.cpp:9:105: error: two or more data types in declaration of 'res'
> ....
> .....
> etc.
>
>
> I think I understand that there is a problem (only under Windows though)
> with the complex type.
> The beginning of my file Cnhat.cpp is as follows:
>
> 1. #include <R.h>
> 2. #include "Rmath.h"
> 3. #include <complex.h>
> 4. #include <iostream>
> 5. using namespace std;
> 6.
> 7. extern"C" {
> 8.
> 9.   void CnhatC(double *vecs, double *vect, double *X, int *n, int *q,
> int *p, int *vecd, complex double *res) {
> 10.
> 11.    void phinhatReturn(double *vect1, double *vect2, double *vect3,
> double *X, int *q, int *n, double _Complex *res1, double _Complex *res2,
> double _Complex *res3);
> 12.    double _Complex tmp2, prod1 = 1.0 + 0.0*_Complex_I, prod2 = 1.0 +
> 0.0*_Complex_I, somme = 0.0 + 0.0*_Complex_I;
> 13.    int indbeginblocl, l, i, *vecdl, k, j;
> 14.    double *vecsl, *mvectl, *diffvecsvectl, *Xl;
> 15.    double _Complex *res1, *res2, *res3;
> 16.    vecdl = new int[1];
> 17.    res1 =  new _Complex double[1];
> ....
> .....
> etc.
>
> As you can see, there seem to be some problem (on line 9.) with: complex
> double *res
>
> Could you please point me to something (e.g., another package) that
> might help me solve the problem? If possible, I would like to avoid
> invest too much time using the new .Call() interface because I am quite
> familiar
> with the old .C(). And also I am not even sure if it would help solving
> the problem.

You should be using Rcomplex in the type declaration. (See Writing R 
Extensions for a discussion of this.)  It is defined as

typedef struct {
	double r;
	double i;
} Rcomplex;

which is likely compatible with your "complex double" on those other 
systems (which are using newer gcc versions), but it's not guaranteed to 
be, even there.

Duncan Murdoch



More information about the R-package-devel mailing list