博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言运行程序无结果,一个奇怪的现象。调试(无端点)状态下经过,结果正确;正式运行程序自动终止...
阅读量:5149 次
发布时间:2019-06-13

本文共 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【组数】【每组内的数的序号】,然后计算每组内的均值和组间的协方差矩阵。

问题:调试状态下运行完全没问题,结果是对的。但是只要摁叹号直接运行,程序就自动终止,在有的电脑上会显示内存不能读。应该是动态分配内存的问题,但是不知道是哪里错了。求大神指点。。。

123606389.gif

------解决方案--------------------

引用: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/

你可能感兴趣的文章
第二章小结
查看>>
STL中的优先级队列priority_queue
查看>>
BZOJ 2223 [Coci 2009]PATULJCI | 主席树练习 (好像是个权限题啊)
查看>>
Vue源码后记-更多options参数(1)
查看>>
UE4 使用UGM制作血条
查看>>
(SPOJ1)Life, the Universe, and Everything
查看>>
http协议详解
查看>>
【每日scrum】第一次冲刺day5
查看>>
浏览器对属性兼容性支持力度查询网址
查看>>
Objective-C语法之NSSortDescriptor
查看>>
使用CSS进行定位
查看>>
C语言 链队列基本操作
查看>>
OO学习总结与体会
查看>>
虚拟机长时间不关造成的问题
查看>>
toString和valueOf的区别
查看>>
C#操作Excel(创建、打开、读写、保存)几种方法的总结
查看>>
校门外的树2 contest 树状数组练习 T4
查看>>
JS及JQ使用JSONP实现跨域调用必应搜索
查看>>
面试整理:Python基础
查看>>
Python核心编程——多线程threading和队列
查看>>