簡體   English   中英

將結構成員作為參數傳遞給 C 中的 Function

[英]Passing Struct Members as Parameter to a Function in C

假設我有以下代碼來獲取班級數學和科學成績的平均值。

typedef struct
{
    char name[30];
    float math;
    float science;
}
grade;
int n = 5;
grade grades[n];

float math_average(int n)
{
    float run_sum = 0;
    for (int i = 0; i < n; i++)
    {
        run_sum += grades[i].math;
    }
    return (run_sum / n);
}

float science_average(int n)
{
    float run_sum = 0;
    for (int i = 0; i < n; i++)
    {
        run_sum += grades[i].science;
    }
    return (run_sum / n);
}

是否可以創建一個廣義平均function 以產生相同的效果? 因此,我只有 1 個主題函數,而不是n 個主題函數。也許像將主題作為參數傳遞之類的東西? 包含的示例可以更好地可視化我想要實現的目標:

float average(int n, /* [SUBJECT] */)
{
    float run_sum = 0;
    for (int i = 0; i < n; i++)
    {
        run_sum += grades[i]./*SUBJECT*/;
    }
    return (run_sum / n);  
}

一般來說,如果你有N個相同性質的變量(字段),你沒有N個聲明,你聲明一個包含N個元素的數組。 因此

#define MATH 0
#define SCIENCE 1
#define NUM_SUBJECTS 2

typedef struct
{
    char name[30];
    float subjects[NUM_SUBJECTS];
} grade;

而不是寫grades[i].math你寫grades[i].subjects[MATH] 當然,現在您可以通過參考grades[i].subjects[j]來編寫一般平均例程。

現在,如果您認為開頭的#define序列非常愚蠢,那么您是對的。 我把它們放在那里只是為了說明。 實際上,您使用單個enum聲明來代替:

enum subjects { MATH, SCIENCE, NUM_SUBJECTS };

當您擴展主題列表時,您只需將NUM_SUBJECTS保留在列表中的最后一項。

當您的主題列表不是一成不變的,而是您的程序的輸入之一時,這種方法自然會擴展到這種情況。 例如,您將需要一種或另一種形式的動態數組

typedef struct
{
    char name[30];
    int num_subjects;
    float *subjects;
} grade;

但通用平均 function 代碼將保持不變

如果需要,可以使用offsetof

float average(int n, int offset)
{
    float run_sum = 0;
    for (int i = 0; i < n; i++)
    {
        //it's a little ugly, but should work as long as your average fields are float
        run_sum += *(float*)(((byte*)&grades[i]) + offset);
    }
    return (run_sum / n);
}

math_average => average(n, offsetof(grade, math))等等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM