C语言头文件中函数定义错误:函数调用不允许出现在常量表达式中
这个错误是因为你在头文件中定义了一个非常复杂的函数,而在主函数中尝试调用它。在C语言中,头文件中的函数定义应该是简单的声明,而不是实际的函数实现。你需要将函数的实现代码移动到一个单独的源文件中,并在头文件中声明该函数。然后在主函数中包含头文件并调用该函数即可。
错误原因
在C语言中,头文件的作用是声明函数、变量、结构体等,以便在其他源文件中使用。头文件不应该包含实际的函数实现。因为:
- 重复定义: 如果在多个源文件中都包含了同一个头文件,而这个头文件中包含了函数的实现,那么就会导致函数被重复定义,编译器会报错。
- 代码组织: 将函数实现和函数声明分开,可以使代码结构更加清晰,易于维护。
解决方法
-
将函数实现移至源文件: 将
Receive_Delay_NUM函数的代码从头文件移动到一个单独的源文件中,例如receive_delay.c。 -
在头文件中声明函数: 在头文件中,使用函数原型声明
Receive_Delay_NUM函数。例如:
float Receive_Delay_NUM(struct PARAMETER * para_p, float *lpf_f_coe, float *receive_sig, float *local_FFT_sig, float *circular_correlation);
- 在主函数中包含头文件: 在主函数所在的源文件中包含头文件,例如:
#include "receive_delay.h" // 假设头文件名为 receive_delay.h
- 在主函数中调用函数: 在主函数中就可以正常调用
Receive_Delay_NUM函数了。
示例
receive_delay.h
float Receive_Delay_NUM(struct PARAMETER * para_p, float *lpf_f_coe, float *receive_sig, float *local_FFT_sig, float *circular_correlation);
receive_delay.c
#include "receive_delay.h"
float Receive_Delay_NUM(struct PARAMETER * para_p, float *lpf_f_coe, float *receive_sig, float *local_FFT_sig, float *circular_correlation){
float *corr_rec_outabs;
corr_rec_outabs=(float *) mem_alloc((rec_len/ downosf+240)* 4);
float *corr_rec_out;
corr_rec_out=(float *) mem_alloc((rec_len/ downosf+240)* 2 * 4);
float *FFT_osf_twiddle;
FFT_osf_twiddle=(float *) mem_alloc(FFT_osf_Num * 2 * 4);
float *HFMsig_rec_lpfout;
HFMsig_rec_lpfout=(float *) mem_alloc(LPF_f_size* 2 * 4);
float *sig_down_frequency_rec;
sig_down_frequency_rec=(float*)mem_alloc(rec_len*2*4);
cho_twiddle_lpf=(float *) mem_alloc(LPF_f_size * 2 * 4);
float *real_down_frequency_factor;
float *imag_down_frequency_factor;
real_down_frequency_factor=(float*)mem_alloc(rec_len*4);
imag_down_frequency_factor=(float*)mem_alloc(rec_len*4);
int i=0;
for(i=0;i<rec_len;i++){
// real_down_frequency_factor[i]=cos((2*Pi*para_p->fc*i)/(para_p->fs));
// imag_down_frequency_factor[i]=-1*sin((2*Pi*para_p->fc*i)/(para_p->fs));
// *(real_down_frequency_factor+i)=cos((2*Pi*para_p->fc*i)/(para_p->fs));
// *(imag_down_frequency_factor+i)=-1*sin((2*Pi*para_p->fc*i)/(para_p->fs));
real_down_frequency_factor[i]=cos((2*Pi*13000*i)/(96000));
imag_down_frequency_factor[i]=-1*sin((2*Pi*13000*i)/(96000));
sig_down_frequency_rec[2*i]=real_down_frequency_factor[i]*receive_sig[i] ;
sig_down_frequency_rec[2*i+1]=imag_down_frequency_factor[i]*receive_sig[i] ;
}
mem_free(imag_down_frequency_factor);
mem_free(real_down_frequency_factor);
//***************滤波,本地导入fir256阶的低通滤波器******************
full_twiddle=(float *) mem_alloc(N0 * 2 * 4);
base_twiddle=(float *) mem_alloc(N_base_twiddle * 2 * 4);
gen_base_twiddle(base_twiddle);
gen_full_twiddle(full_twiddle, base_twiddle, N0); // generate the full length twiddle factor for N0 points FFT, the length is N0 (complex float numbers);
choose_twiddle(cho_twiddle_lpf, full_twiddle, LPF_f_size, N0); // generate the twiddle factor for the16384 points FFT
choose_twiddle(FFT_osf_twiddle, full_twiddle, FFT_osf_Num, N0); // generate the twiddle factor for the 2048 points FFT
mem_free(base_twiddle);
mem_free(full_twiddle);
memset(HFMsig_rec_lpfout,0,LPF_f_size*2*4);
fft_conv(sig_down_frequency_rec, lpf_f_coe, HFMsig_rec_lpfout, cho_twiddle_lpf, LPF_f_size, rec_len, LPF_coe_len, 1);//做低通滤波
mem_free(cho_twiddle_lpf);
mem_free(sig_down_frequency_rec);
//**********************接收信号降采样************
float *HFMsig_rec_lpfoutosf;
HFMsig_rec_lpfoutosf=(float *) mem_alloc(LPF_f_size* 2 * 4);
memset(HFMsig_rec_lpfoutosf, 0, (LPF_f_size) * 2 * 4);
HFMsig_rec_lpfoutosf=HFMsig_rec_lpfoutosf+480;//指针移到要搬移部分之后240点(复信号)
down_sample_sha(HFMsig_rec_lpfout,HFMsig_rec_lpfoutosf,rec_len,downosf);
HFMsig_rec_lpfoutosf=HFMsig_rec_lpfoutosf-480;//给指针移回来准备给前面放上上次采集的信号
for(i=0;i<480;i++){
HFMsig_rec_lpfoutosf[i]=circular_correlation[i];
}
for(i=0;i<480;i++){
circular_correlation[i]=HFMsig_rec_lpfoutosf[i+2*rec_len/ downosf];
}
//*****************降采样之后做相关********************(对接收信号做fft->和本地共轭相乘->ifft)
memset(corr_rec_out, 0, (rec_len/ downosf+240) * 2 * 4);
fft_corr(HFMsig_rec_lpfoutosf, local_FFT_sig, corr_rec_out, FFT_osf_twiddle, FFT_osf_Num, rec_len/ downosf+240, 240);
mem_free(HFMsig_rec_lpfoutosf);//n
mem_free(HFMsig_rec_lpfout);//bn
mem_free(FFT_osf_twiddle);//n
for(i=0;i<rec_len/ downosf+240;i++){
corr_rec_outabs[i]=corr_rec_out[2*i]*corr_rec_out[2*i]+corr_rec_out[2*i+1]*corr_rec_out[2*i+1];//给实虚结合合成abs的平方
corr_rec_outabs[i]=sqrt(corr_rec_outabs[i]);
}
mem_free(corr_rec_out);//bn
int maxidx;
// int maxval;
// maxval=DSPF_sp_maxval(corr_rec_outabs, rec_len/ downosf+240);
maxidx=DSPF_sp_maxidx(corr_rec_outabs, rec_len/ downosf+240);
mem_free(corr_rec_outabs);//bn
return maxidx;
}
main.c
#include "receive_delay.h"
int main(){
// ...
int maxidx = Receive_Delay_NUM(para_p, lpf_f_coe, receive_sig, local_FFT_sig, circular_correlation);
// ...
}
注意:
- 确保所有头文件和源文件都在同一个目录下,或者设置好编译器的头文件搜索路径。
- 在编译时,需要将
receive_delay.c文件也添加到编译列表中。 - 上述示例中的
mem_alloc和mem_free函数,以及其他函数,需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/nLpA 著作权归作者所有。请勿转载和采集!