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

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to