From hin-tak.leung at cimr.cam.ac.uk  Thu Jan  5 17:05:54 2006
From: hin-tak.leung at cimr.cam.ac.uk (Hin-Tak Leung)
Date: Thu, 05 Jan 2006 16:05:54 +0000
Subject: [Rd] Problems with calloc function.
In-Reply-To: <a55593730601030745k1b7439d4v4ff58051b240cd0d@mail.gmail.com>
References: <a55593730512290649w497ffc10p75c5fd7f71af402b@mail.gmail.com>	<Pine.LNX.4.61.0512291524370.31762@gannet.stats>
	<a55593730601030745k1b7439d4v4ff58051b240cd0d@mail.gmail.com>
Message-ID: <43BD43E2.2000208@cimr.cam.ac.uk>

Hi Marcelo,

You need to read the R extension manual more carefully...
Basically you haven't deference thed pointers. You think you
were allocating say, col=2, but instead you were allocating &col
in int's, the address of col, which is a large number since
user-land memory address starts at a large offset (0x40000000? =
1/2 GB or 0x80000000 = 1GB?),
so after 4 large allocations, you run out of memory.

Everything through the C interface is passed by pointer, in the
fortran convention.

BTW, you should use Rprintf() instead of printf(). Details below.

Hin-Tak Leung

Marcelo Damasceno wrote:
> Hello all and Prof. Brian Ripley ,
> 
> Sorry about my incautiousness, I use the tips, but is happen same problems.
> Below the R code.
> ################################################################
> rspcplot <- function(file1="dg_01.lab.txt"){
>   if(is.null(n))
>     stop("You need first run the function cluster")
>     file<-"dg_01.lab.txt"
>     aux<-file1
>     file1<-pmatch(file1,file)
>   if(is.na(file1)){
>       matrix=loadMatrix(file,n)
>   }
>   else{
>       matrix=loadMatrix(aux,n)
>   }
>   matrixc<-correct(matrix)
>   #merge2(matrixc)
>   nrow=nrow(matrixc)
>   ncol=ncol(matrixc)
>   ntemp=getTemp()
>   out <- .C("merge2",matrixc,nrow, ncol,ntemp,outMerge=as.integer
> (0),outHeight=as.integer(0),PACKAGE="rspc")
> ##########################################################################
> Below the C code.
> ##########################################################################
> void merge2(int *nmat,int nrow,int ncol, int *ntemp,int ntam, int *out, int
> *height){

Here, you should have "*ncol" instead of "ncol". (I am only correcting 
this one - you can change the others) like this:

	void merge2(int *nmat,int nrow,int *ncol, int *ntemp,int ntam,      int 
*out, int *height){

>     int row,col,*temp,i,j,k,n3,tam,x,aux2,n1;
>     row = nrow;
>     col = ncol;

You should use here:

	int col = *ncol;

> 
>     int *temp1,*temp2,*temp3,*temp4;
> 
>     temp1 = (int*)Calloc(col,int);


inserting here:

	Rprintf("I am trying to allocate col = %d\n", col);

would have told you what's wrong with your code...

>     printf("OK1 \n");


>     temp2 = (int*)Calloc(col,int);
>     printf("OK2 \n");
>     temp3 = (int *)Calloc(col,int);
>     printf("OK3 \n");
>     temp4 = (int *)Calloc(col,int);
>     if(temp4 == NULL){
>         printf("\n\n No Memory4!");
>         exit(1);
>     }
>     printf("OK4\n");
>     int *cvector;
>     cvector = (int *)Calloc(col,int);
>     if(cvector == NULL){
>         printf("\n\n No Memory5!");
>         exit(1);
>     }
>     printf("OK5\n");
>     tam=ntam;
> #######################################################################
> Output of Work Space:
> 
> 
>>rspcplot()
> 
> Read 525 items
> Read 101 items
> OK1
> OK2
> OK3
> OK4
> Error in rspcplot() : Calloc could not allocate (145869080 of 4) memory
> 
> 
> Using the Ruspini data, the values of variables col = 2 and row = 75. I was
> thinking that the number of pointers and space of memory are too big.
> 
> 
> Thanks All !
<earlier posts snipped>



[Rd] Problems with calloc function.
Hin-Tak Leung