免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3277 | 回复: 3
打印 上一主题 下一主题

这个程序老是有Segementation fault ,请教一下各位前辈怎么改 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-26 10:44 |只看该作者 |倒序浏览
#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;
}

论坛徽章:
0
2 [报告]
发表于 2004-03-26 11:04 |只看该作者

这个程序老是有Segementation fault ,请教一下各位前辈怎么改

检查你的数组边界,是否越界,还有是否使用了空指针或者野指针。
导致Segementation fault 主要是因为使用了没有申请的内存
zkyguanl 该用户已被删除
3 [报告]
发表于 2004-03-26 11:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2004-03-26 12:45 |只看该作者

这个程序老是有Segementation fault ,请教一下各位前辈怎么改

太谢谢各位了!:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP