[GRASS-dev] Error while compiling i.pr Windows GRASS6.4
Glynn Clements
glynn at gclements.plus.com
Fri Dec 4 13:42:21 EST 2009
António Rocha wrote:
>
> Hi Glynn
> I think you do magic because I've tried a couple of times without
> success and, right after I received your email I suceed compiling
> dllmain.c. :)
>
> About OBJDIR, At GRASS.make it's defined as you said:
> OBJDIR = OBJ.$(ARCH)
> So no problem with this
>
> Now, with compiling i.pr:
> I'm getting the following error (see below). it has something to do with
> drand48. drand48 is a function mentioned in line 42 of bootstrap.c of
> PRLIB folder.
> Does this function ring a bell? I have searched and there is no file
> with that name in GRASS6 folder neither sourcecode or snapshot.
drand48() is a standard function on most Unix systems, but Windows
doesn't have it. If you look in include/config.h, you'll see:
/* define if drand48() exists */
/* #undef HAVE_DRAND48 */
It's easy enough to simulate it; the following is adapted from
raster/r.mapcalc/xrand.c:
#if !defined(HAVE_DRAND48)
#define drand48() ((double)rand()/((double)RAND_MAX + 1))
#endif
The above should either be added to the top of i.pr/PRLIB/svm.c (if
that is the only file which needs it), or added to
i.pr/include/global.h (if several files need it).
OTOH, if the algorithm requires a high level of randomness, it might
need something better; Windows' rand() function only returns 15 bits
of data, which may not be enough.
A more accurate solution is:
#if !defined (HAVE_DRAND48)
#if defined(HAVE_LONG_LONG_INT)
static unsigned long long state;
/* see:
* http://www.opengroup.org/onlinepubs/9699919799/functions/drand48.html
*/
static unsigned long long next(void) {
state = (0x5DEECE66DULL * state + 0xB) & 0xFFFFFFFFFFFFULL;
return state;
}
double drand48(void) {
return (double) next() / 0x1000000000000ULL;
}
#else
/* no drand48(), no "long long" type, don't know whether "long"
* is 64-bit and can't be bothered implementing multi-word
* arithmetic, so we'll have to live with this crude approximation
*/
#define drand48() ((double)rand()/((double)RAND_MAX + 1))
#endif
#endif
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev
mailing list