On 19 Mar 2014, at 22:58 , Christophe Genolini <cgeno...@u-paris10.fr> wrote:

> Hi the list,
> 
> One of my package has a memory issue that I do not manage to understand. The 
> Memtest notes is here:
> <http://www.stats.ox.ac.uk/pub/bdr/memtests/valgrind/kml-Ex.Rout>
> 
> Here is the message that I get from Memtest
> 
> --- 8< ----------------
> ~ Fast KmL ~
> ==27283== Invalid read of size 4
> ==27283==    at 0x10C5DF28: kml1 (kml.c:183)
> ...
> ==27283==    by 0x10C5DE4F: kml1 (kml.c:151)
> ...
> ==27283==    at 0x10C5DF90: kml1 (kml.c:198)
> --- 8< ----------------
> 
> 
> Here is the function kml1 from the file kml.c (I add some comments to tag the 
> lines 151, 183 and 198)
> 
> --- 8< ----------------
> void kml1(double *traj, int *nbInd, int *nbTime, int *nbClusters, int *maxIt, 
> int *clusterAffectation1, int *convergenceTime){
> 
>    int i=0,iter=0;
>    int *clusterAffectation2=malloc(*nbInd * sizeof(int));                     
>  // lines 151
>    double *trajMean=malloc(*nbClusters * *nbTime * sizeof(double));
> 
>    for(i = 0; i < *nbClusters * *nbTime; i++){trajMean[i] = 0.0;};
>    for(i = 0; i < *nbInd; i++){clusterAffectation2[i] = 0;};
> 
>    for(iter = 0; iter < *maxIt; iter+=2){
>       calculMean(traj,nbInd,nbTime,clusterAffectation1,nbClusters,trajMean);
>               
> affecteIndiv(traj,nbInd,nbTime,trajMean,nbClusters,clusterAffectation2);
> 
>       i = 0;
>       while(clusterAffectation1[i]==clusterAffectation2[i] && i 
> <*nbInd){i++;}; // lines 183
>       if(i == *nbInd){
>           *convergenceTime = iter + 1;
>           break;
>       }else{};
> 
>       calculMean(traj,nbInd,nbTime,clusterAffectation2,nbClusters,trajMean);
>       affecteIndiv(traj,nbInd,nbTime,trajMean,nbClusters,clusterAffectation1);
> 
>       i = 0;
>       while(clusterAffectation1[i]==clusterAffectation2[i] && 
> i<*nbInd){i++;}; // lines 198
>       if(i == *nbInd){
>           *convergenceTime = iter + 2;
>           break;
>       }else{};
>    }
> }
> --- 8< ----------------
> 
> Do you know what is wrong in my C code?

Yes. You need to reverse operands of &&. Otherwise you'll be indexing with 
i==*nbind before finding that (i < *nbind) is false. 

> Thanks
> 
> Christophe
> 
> -- 
> Christophe Genolini
> Maître de conférences en bio-statistique
> Université Paris Ouest Nanterre La Défense
> INSERM UMR 1027
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

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

Reply via email to