繁体   English   中英

如何在ANSI C程序中将数组的元素作为参数传递给函数进行修改?

[英]how to pass element of array as argument to function for it to modify, in ANSI C program?

我了解如何将数组传递给函数,并让该函数更新数组的值。 我很难理解如何将数组的ELEMENT传递给函数并让该函数更新该元素。 我的猜测如下,但是从gcc: "warning: conflicting types for 'CDivide'"产生了以下内容gcc: "warning: conflicting types for 'CDivide'"

main()函数定义有问题的数组,并将它们(作为参考)作为complex_realcomplex_imag传递给fn_v1p0 ,在函数fn_v1p0的函数定义fn_v1p0它们声明为指针。 main()包括这些函数的原型,如下所示。

void fn_v1p0(double *, double *, char *, double *, unsigned int, double *);
void CDivide(double *, double *, double, double, double, double);

但是, main()位于一个文件中,而其他两个函数位于另一个文件中。 只有主文件包含这些原型。

我需要执行复杂的除法(ANSI C中不支持),这是功能CDivide的目的。 fn_v1p0功能还有更多,但我将其简化为仅显示此问题所需的内容。

我已经将complex_real[ii]视为简单的双CDivide值,希望如果在其前面加上&,则可以如图所示编写CDivide 但是我的猜测没有用。 不确定解决此问题的最佳方法是什么。

void fn_v1p0(
    double *complex_real, double *complex_imag, 
    char *selected_form,    
    double *freq,          
    unsigned int len_freq, 
    double *Hparams)
{
    int ii = 0;
    double a0, b0;

    for (ii = 0; ii <= len_freq; ii++) {
       CDivide( &complex_real[ii], &complex_imag[ii], b0, 0, a0, freq[ii] );
    } 
}

哪里

void CDivide( 
    double *z_real, double *z_imag, double a, double b, double c, double d) 
{
    double divisor = c*c + d*d; 
    *z_real = (a*c + b*d) / divisor; 
    *z_imag = (b*c - a*d) / divisor; 
}

问题在于CDivide函数的原型需要驻留在包含CDivide和fn_v1p0定义的文件中,而不是驻留在包含main()函数的文件中。 将CDivide的原型移至包含CDivide的文件可清除该错误。 感谢亚当·罗森菲尔德(Adam Rosenfield)用上面问题中的评论消除了这个问题。

取2个函数对CDivide_real(a,b,c,d)和CDivide_imag(a,b,c,d)进行双重处理,或者将一个双指针数组传递给CDivide,例如CDivide(double * x [2],a,b,c ,d),然后

for (ii = 0; ii <= len_freq; ii++) {
   double *a[]={&complex_real[ii],&complex_imag[ii]};
   CDivide( a, b0, 0, a0, freq[ii] );
} 

和在CDivide中

void CDivide( 
    double *x[2], double a, double b, double c, double d) 
{
    double divisor = c*c + d*d; 
    *x[0] = (a*c + b*d) / divisor; 
    *x[1] = (b*c - a*d) / divisor; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM