[英]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.