C程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"解决思路
C程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"
求大神帮助,急啊。
程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float shuju[101]={0.0f};
float A_B(float pp);
void main()
{
int ii;
float pp=0.0f;
for(ii=0;ii<100;ii++)
{
pp=pp+0.01f;
shuju[ii]=A_B(pp);
}
for(ii=0;ii<=100;ii++)
{
printf("%d",ii);
printf("-----");
printf("%d\n",shuju[ii]);
}
}
float A_B(float pp)
{
register int i,j;
register int k;
int N,M;//行,列
float *p=NULL;
float *q=NULL;
float *d=NULL;
float *a=NULL;
float *s=NULL; //s数组为各行概率累加求和
float **p_yx=NULL; //二维数组p_yx存放信道矩阵
float C,b,u,max,IL,IU; //C为信道容量,b为迭代精度
// printf("输入信源符号X的个数N="); //输入行列
// scanf("%d",&N);
// printf("输出信源符号Y的个数M=");
// scanf("%d",&M);
p=(float *)calloc(N,sizeof(float)); //初始化需要用到的数组
q=(float *)calloc(M,sizeof(float));
d=(float *)calloc(N,sizeof(float));
a=(float *)calloc(N,sizeof(float));
s=(float *)calloc(N,sizeof(float));
p_yx=(float **)calloc(N,sizeof(float));
for(i=0;i<N;i++)
{
p_yx[i]=(float *)calloc(M,sizeof(float));
}
p_yx[0][0]=1.0f;
p_yx[0][1]=0.0f;
p_yx[1][0]=pp;
p_yx[1][1]=1-pp;
/* printf("请输入信道矩阵:\n"); //输入信道矩阵
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
printf("p_yx[%d][%d]=",i,j);
scanf("%f",&p_yx[i][j]);
}
printf("\n");
}
*/
b=0.0001f;
/* for(i=0;i<N;i++) //判断输入的信道矩阵是否符合概率分布
{
s[i]=0.0;
for(j=0;j<M;j++)
s[i]=s[i]+p_yx[i][j];
}
for(i=0;i<N;i++)
{
if(s[i]<=0.999999||s[i]>=1.000001)
printf("不符合概率分布");
else
if(s[N-1]>=0.999999&&s[N-1]<1.000001)
{
printf("请输入迭代精度:");
scanf("%f",&b);
}
break;
}
*/
for(i=0;i<N;i++) //取初始概率为均匀分布
p[i]=1.0f/N;
for(j=0;j<M;j++) //计算q[j]
{
q[j]=0;
for (i=0;i<N;i++)
q[j]=q[j]+p[i]*p_yx[i][j];
}
for(i=0;i<N;i++) //计算a[i]
{
d[i]=0;
for(j=0;j<M;j++)
{
if(p_yx[i][j]==0)
d[i]=d[i]+0;
else
d[i]=d[i]+p_yx[i][j]*log(p_yx[i][j]/q[j]);
}
a[i]=exp(d[i]);
}
u=0.0;
for(i=0;i<N;i++) //计算u
u=u+p[i]*a[i];
IL=log(u)/log(2.0); //计算IL
max=a[0];
for(i=0;i<N;i++)
{
if(a[i]>=max)
max=a[i];
}
IU=log(max)/log(2.0); //计算IU
k=1;
C=IL;
while((IU-IL)>=b)//迭代计算
{
for(i=0;i<N;i++)
p[i]=p[i]*a[i]/u;
for(j=0;j<M;j++) //计算q[j]
{
q[j]=0;
for (i=0;i<N;i++)
q[j]=q[j]+p[i]*p_yx[i][j];
}
求大神帮助,急啊。
程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float shuju[101]={0.0f};
float A_B(float pp);
void main()
{
int ii;
float pp=0.0f;
for(ii=0;ii<100;ii++)
{
pp=pp+0.01f;
shuju[ii]=A_B(pp);
}
for(ii=0;ii<=100;ii++)
{
printf("%d",ii);
printf("-----");
printf("%d\n",shuju[ii]);
}
}
float A_B(float pp)
{
register int i,j;
register int k;
int N,M;//行,列
float *p=NULL;
float *q=NULL;
float *d=NULL;
float *a=NULL;
float *s=NULL; //s数组为各行概率累加求和
float **p_yx=NULL; //二维数组p_yx存放信道矩阵
float C,b,u,max,IL,IU; //C为信道容量,b为迭代精度
// printf("输入信源符号X的个数N="); //输入行列
// scanf("%d",&N);
// printf("输出信源符号Y的个数M=");
// scanf("%d",&M);
p=(float *)calloc(N,sizeof(float)); //初始化需要用到的数组
q=(float *)calloc(M,sizeof(float));
d=(float *)calloc(N,sizeof(float));
a=(float *)calloc(N,sizeof(float));
s=(float *)calloc(N,sizeof(float));
p_yx=(float **)calloc(N,sizeof(float));
for(i=0;i<N;i++)
{
p_yx[i]=(float *)calloc(M,sizeof(float));
}
p_yx[0][0]=1.0f;
p_yx[0][1]=0.0f;
p_yx[1][0]=pp;
p_yx[1][1]=1-pp;
/* printf("请输入信道矩阵:\n"); //输入信道矩阵
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
printf("p_yx[%d][%d]=",i,j);
scanf("%f",&p_yx[i][j]);
}
printf("\n");
}
*/
b=0.0001f;
/* for(i=0;i<N;i++) //判断输入的信道矩阵是否符合概率分布
{
s[i]=0.0;
for(j=0;j<M;j++)
s[i]=s[i]+p_yx[i][j];
}
for(i=0;i<N;i++)
{
if(s[i]<=0.999999||s[i]>=1.000001)
printf("不符合概率分布");
else
if(s[N-1]>=0.999999&&s[N-1]<1.000001)
{
printf("请输入迭代精度:");
scanf("%f",&b);
}
break;
}
*/
for(i=0;i<N;i++) //取初始概率为均匀分布
p[i]=1.0f/N;
for(j=0;j<M;j++) //计算q[j]
{
q[j]=0;
for (i=0;i<N;i++)
q[j]=q[j]+p[i]*p_yx[i][j];
}
for(i=0;i<N;i++) //计算a[i]
{
d[i]=0;
for(j=0;j<M;j++)
{
if(p_yx[i][j]==0)
d[i]=d[i]+0;
else
d[i]=d[i]+p_yx[i][j]*log(p_yx[i][j]/q[j]);
}
a[i]=exp(d[i]);
}
u=0.0;
for(i=0;i<N;i++) //计算u
u=u+p[i]*a[i];
IL=log(u)/log(2.0); //计算IL
max=a[0];
for(i=0;i<N;i++)
{
if(a[i]>=max)
max=a[i];
}
IU=log(max)/log(2.0); //计算IU
k=1;
C=IL;
while((IU-IL)>=b)//迭代计算
{
for(i=0;i<N;i++)
p[i]=p[i]*a[i]/u;
for(j=0;j<M;j++) //计算q[j]
{
q[j]=0;
for (i=0;i<N;i++)
q[j]=q[j]+p[i]*p_yx[i][j];
}