这个错误是因为你在头文件中定义了一个非常复杂的函数,而在主函数中尝试调用它。在C语言中,头文件中的函数定义应该是简单的声明,而不是实际的函数实现。你需要将函数的实现代码移动到一个单独的源文件中,并在头文件中声明该函数。然后在主函数中包含头文件并调用该函数即可。

错误原因

在C语言中,头文件的作用是声明函数、变量、结构体等,以便在其他源文件中使用。头文件不应该包含实际的函数实现。因为:

  • 重复定义: 如果在多个源文件中都包含了同一个头文件,而这个头文件中包含了函数的实现,那么就会导致函数被重复定义,编译器会报错。
  • 代码组织: 将函数实现和函数声明分开,可以使代码结构更加清晰,易于维护。

解决方法

  1. 将函数实现移至源文件:Receive_Delay_NUM函数的代码从头文件移动到一个单独的源文件中,例如receive_delay.c

  2. 在头文件中声明函数: 在头文件中,使用函数原型声明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);
  1. 在主函数中包含头文件: 在主函数所在的源文件中包含头文件,例如:
#include "receive_delay.h" // 假设头文件名为 receive_delay.h
  1. 在主函数中调用函数: 在主函数中就可以正常调用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_allocmem_free函数,以及其他函数,需要根据实际情况进行调整。
C语言头文件中函数定义错误:函数调用不允许出现在常量表达式中

原文地址: https://www.cveoy.top/t/topic/nLpA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录