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