我在C中编写了这个函数,它在两个数组中导入一个两列文件,然后如果函数的输入值位于它们之间,则找到两个连续点之间的线性插值。
double Prevot_redden(double wave, double Av)
{
int i,j;
const double Rv = 2.75; /* Set by Prevot */
double micron, r = 0.;
micron = wave * 1e6; /* convert to micron */
/*Prevot reddening counters*/
int raw_prevot_size=4002;
/*data array for raw Prevot reddening */
double *raw_prevot_wave_data,*raw_prevot_data;
/*allocate space for raw Prevot reddening*/
raw_prevot_wave_data=(double *)calloc(raw_prevot_size,sizeof(double *));
raw_prevot_data=(double *)calloc(raw_prevot_size,sizeof(double *));
/*reading a file*/
char *f_prevot=fopen("SMC_prevot.dat","r");
if (f_prevot==NULL )
{
fprintf(stderr,"Can not open reddening file !\n");
exit(-1);
}
for (i=0;i<raw_prevot_size;i++)
{
sscanf(f_prevot,"%lf %lf",&raw_prevot_wave_data[i],&raw_prevot_data[i]);/*Wavelength and E(lambda-V)/E(B-V)*/
/* convert to micron */
raw_prevot_wave_data[i]*=1e-4;
}
for (j = 0; j < raw_prevot_size-2; j++)
{
if ((micron>raw_prevot_wave_data[j]) &&(micron<=raw_prevot_wave_data[j+1]))
{
r= lininterp(raw_prevot_wave_data[j],
raw_prevot_wave_data[j+1],
raw_prevot_data[j],
raw_prevot_data[j+1],
micron);
}
}
r *= Av;
r /= Rv;
r /= -2.5;
r = pow(10, r);
return(r);
}
当我编译代码时,对于带有命令fopen的行,我收到此警告消息。 有人可以解释消息的原因是什么吗?!!
In function 'Prevot_redden':
14: warning: initialization from incompatible pointer type
答案 0 :(得分:1)
你需要
FILE *f_prevot=fopen("SMC_prevot.dat","r");
·..
if (fscanf(f_prevot,"%lf %lf",&raw_prevot_wave_data[i],&raw_prevot_data[i]) == 2)
...
fclose(f_prevot);
答案 1 :(得分:0)
FILE *f_prevot=fopen("SMC_prevot.dat","r");
将是我的第一次尝试,因为fopen返回FILE * type
的指针答案 2 :(得分:0)
char *f_prevot=fopen("SMC_prevot.dat","r");
fopen()返回FILE *,而不是char *