本文共 3021 字,大约阅读时间需要 10 分钟。
一个奇怪的现象。调试(无端点)状态下通过,结果正确;正式运行程序自动终止
#include
#include "stdlib.h"
#include "string.h"
//计算均值和协方差 子函数声明
int* GetMeanNum(int** Data,int pixelNum,int BandNum);
double* GetFCNum(int** Data,int BandNum,int pixelNum,int* Mean);
int main()
{
FILE *fp1,*fp2;
fp1 = fopen("E:\\data.txt","r");
fp2 = fopen("E:\\result.txt","w");
//容错
if(!fp1)
{
printf("Cannot open data!\n\n");
return 0;
}
if(!fp2)
{
printf("Cannot open result!\n\n");
return 0;
}
int i;
//读出波段数
int BandNum = 0;
fscanf(fp1,"%d",&BandNum);
fgetc(fp1);
//读出每波段像元数
int pixelNum=0;
fscanf(fp1,"%d",&pixelNum);
fgetc(fp1);
//文件指针已经移动到数据区
//像元数据 注意二维的声明和初始化
int **band;
band = (int**)malloc(sizeof(int*)*BandNum);
for(i=0;i
{
band[i] = (int*)malloc(sizeof(int)*pixelNum);
memset(band[i],0,sizeof(int)*pixelNum);
}
//开始读取像元数据
for(i=0;i
{
fscanf(fp1,"%d",&band[0][i]);
}
fgetc(fp1);
for(i=0;i
{
fscanf(fp1,"%d",&band[1][i]);
}
fgetc(fp1);
for(i=0;i
{
fscanf(fp1,"%d",&band[2][i]);
}
fgetc(fp1);
//求均值向量 Mean[3]
int *Mean = (int*)malloc(sizeof(int)*BandNum);
memset(Mean,0,sizeof(Mean));
Mean = GetMeanNum(band,pixelNum,BandNum);
//求协方差矩阵
//现在有三个波段的数据band[i] 有三个波段的均值Mean[i] i= 0~2
//现在要求协方差矩阵Dij 3x3
double* Dij;
Dij = (double*)malloc(sizeof(double)*BandNum*BandNum);
for(i=0;i
{
Dij[i] = 0;
}
Dij = GetFCNum(band,BandNum,pixelNum,Mean);
//输出结果
fprintf(fp2,"均值向量为:\n");
for(i=0;i
{
fprintf(fp2,"%d",Mean[i]);
fprintf(fp2,"\t");
}
fprintf(fp2,"\n");
fprintf(fp2,"协方差矩阵为:\n");
for(i=0;i<9;i++)
{
fprintf(fp2,"%f",Dij[i]);
fprintf(fp2,"\t");
if((i+1)%3==0)
{
fprintf(fp2,"\n");
}
}
printf("结果已存入E:\\result.txt!!");
//free(Mean);
//free(Dij);
free(band);
fclose(fp1);
fclose(fp2);
return 0;
}
int* GetMeanNum(int** Data,int pixelNum,int BandNum)
{
//求均值向量 Mean[3]'
int i;
int sum1=0,sum2=0,sum3=0;
int *Mean = (int*)malloc(sizeof(int)*BandNum);
memset(Mean,0,sizeof(Mean));
for(i=0;i
{
sum1 += Data[0][i];
sum2 += Data[1][i];
sum3 += Data[2][i];
}
Mean[0] = sum1 / pixelNum;
Mean[1] = sum2 / pixelNum;
Mean[2] = sum3 / pixelNum;
return Mean;
}
double* GetFCNum(int** Data,int BandNum,int pixelNum,int* Mean)
{
int i;
double* Dij;
Dij = (double*)malloc(sizeof(double)*BandNum);
for(i=0;i<9;i++)
{
Dij[i] = 0;
}
double tmp = 0.0;
memset(Dij,0,sizeof(Dij));
int m=0,n=0;
for(m=0;m
{
for(n=0;n
{
tmp=0;
for(i=0;i
{
tmp += (Data[m][i] - Mean[m])*(Data[n][i] - Mean[n]);
}//for i
Dij[m*3+n] = tmp / pixelNum;
}//for n
}//for m
return Dij;
}
Data.txt的数据有点多,请到http://pan.baidu.com/s/1i37ft9F 下载data.txt....
数据的意思就是:有3组数据,每组数据有1327个数,我把这三组数据读入二维数组Data【组数】【每组内的数的序号】,然后计算每组内的均值和组间的协方差矩阵。
问题:调试状态下运行完全没问题,结果是对的。但是只要摁叹号直接运行,程序就自动终止,在有的电脑上会显示内存不能读。应该是动态分配内存的问题,但是不知道是哪里错了。求大神指点。。。
------解决方案--------------------
引用:Quote: 引用:这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方
大概不是软件的问题吧,因为我在不同的电脑上都试过,其他程序都行,就这个。。
什么编译器 你试过的都是什么编译器
------解决方案--------------------
错误很多
int *Mean = (int*)malloc(sizeof(int)*BandNum);
memset(Mean,0,sizeof(Mean));
Mean = GetMeanNum(band,pixelNum,BandNum);
内存泄露,下面Dij处同理
Dij = (double*)malloc(sizeof(double)*BandNum);
Dij[m*3+n] = tmp / pixelNum;
m*3+n超出了Dij指向的可用内存的大小
转载地址:http://amdnv.baihongyu.com/