簡體   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