Chinaunix

标题: 这个程序老是有Segementation fault ,请教一下各位前辈怎么改 [打印本页]

作者: hugoyg    时间: 2004-03-26 10:44
标题: 这个程序老是有Segementation fault ,请教一下各位前辈怎么改
#include <stdlib.h>;
#include <stdio.h>;
#include <assert.h>;
#include <math.h>;
//extern "C"
#include "cluster.h"

int* Clustering(double** data,int row,int column,char* method);

int main(int  argc,char  *argv[])
{
        FILE   *fin;
        char*  method="";
        int    row,column;
        double  **data;
       
        /*        assert command        */
        if (argc !=3)
        {
      printf("Usage: %s <data file>; <method>;\n", argv[0]) ;
      exit(1) ;
        }

        fin = fopen( argv[1], "r" );
        if (fin == NULL)
        {
      printf("Not able to open file %s\n", argv[1]);
      exit(1);
        }

        sscanf(argv[2], "%s", method);
        fscanf(fin, "%d        %d", &row,&column);
       

       
        /*        allocate matrix        memory*/
        data = (double **) malloc(row*sizeof(double *));
        assert(data);
        for (int i=0; i<row; ++i)
        {
                data = (double *) calloc(column, sizeof(double));
                assert(data);
        }

        /*        make data matrix from datafile */
        for (int i=0; i<row; ++i)
                for(int j=0; j<column;j++)
                        fscanf(fin, "%f", &data[j]);
   
        fclose(fin);
       
        int* result;
        result=Clustering(data,row,column,method);
       
        /*        output the result        */
        printf("%d,%d\n",row,column);
        for(int i=0;i<row;i++)
        {
                printf("%2d:%2d\n",i,result);
        }
        printf("\n";
        free (result);
        for(int i=0;i<column;i++)free(data);
        free(data);
        return 0;
}


int* Clustering(double** data,int row,int column,char* method)
{
        /* make mask matrix*/
        int** mask;
        mask=(int **) malloc(row*sizeof(int *));
        for(int i=0;i<row;i++)
                mask=(int*) calloc(column,sizeof(int));
        for(int i=0;i<row;i++)
                for(int j=0;j<column;j++)
                        mask[row][column]=1;

        /* make result matrix*/
        int (*result)[2]=(int(*)[2])malloc(row*sizeof(int[2]));
        //result=(int**) malloc(row*sizeof(int*));
        //for(int i=0;i<row;i++)
        //        result=(int*)calloc(2,sizeof(int));
        //for(int i=0;i<row;i++)
        //        result[0]=i;

        /* make distance matrix */
        char method_cluster;
        if(method=="C"
                method_cluster='m';
        else if (method=="S"
                method_cluster='s';
        else if (method=="CL"
                method_cluster='x';
        else if (method=="a"
                method_cluster='v';
        else
                {
                        printf("Method error!\n";
                        exit(0);
                }
        double** distmatrix;
        distmatrix=(double**) malloc(row*sizeof(double*));
        for(int i=0;i<row;i++)
                distmatrix=(double*) calloc(column,sizeof(double));
    double* weight;
        weight=(double*) malloc(column*sizeof(double));
        for(int i=0;i<row;i++)weight=1.0;
        int index1[1],index2[1];
        for(int i=0;i<row;i++)
                for(int j=0;j<column;j++)
                        distmatrix[j]=clusterdistance(row,column,data,mask,weight,
                                                                                        1,1,index1,index2,'e',method_cluster,0);
       
        /* call main treecluster*/
        double* linkdist;
        linkdist=(double*) calloc((row-1),sizeof(double));
        treecluster(row,column,data,mask,weight,0,0,'e','m',result,linkdist,distmatrix);
        int* clusterid=(int*)malloc((row-1)*sizeof(int));
        cuttree(row,result,2,clusterid);
        /* free memory*/
        free(weight);
        free(linkdist);
        for(int i=row;i>;0;--i)
                free(mask[i-1]);
        free (mask);

        for(int i=row;i>;0;--i)
                free(distmatrix[i-1]);
        free (distmatrix);
       
        for(int i=row;i>;0;--i)
                free(result[i-1]);
        free (result);

        /* return cluster result */
        int* cluster_result;
        cluster_result=(int*)malloc((row-1)*sizeof(int));
        for(int i=0;i<row;i++)
                *(cluster_result+i)=clusterid;
        return cluster_result;
}
作者: liupch    时间: 2004-03-26 11:04
标题: 这个程序老是有Segementation fault ,请教一下各位前辈怎么改
检查你的数组边界,是否越界,还有是否使用了空指针或者野指针。
导致Segementation fault 主要是因为使用了没有申请的内存
作者: zkyguanl    时间: 2004-03-26 11:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: hugoyg    时间: 2004-03-26 12:45
标题: 这个程序老是有Segementation fault ,请教一下各位前辈怎么改
太谢谢各位了!:)




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2