วิธีการส่งข้อมูล Structure ให้ฟังก์ชัน (3 วิธี)
- ส่งสมาชิกแต่ละตัว
- ส่ง Structure ทั้งหมด (Passing entire structure) - หัวข้อนี้
- ส่งที่อยู่ของ Structure
หลักการทำงาน
- ส่งชื่อตัวแปร structure ไปใน function call
- ฟังก์ชันรับค่าในพารามิเตอร์ที่เป็น structure variable อีกตัวหนึ่ง (call by value)
- คอมไพเลอร์จะสร้างสำเนา (copy) ของ structure ทั้งหมด
ข้อเสีย
- เสียหน่วยความจำและเวลา เพราะต้องสร้างสำเนาของ structure ทั้งหมด
- การเปลี่ยนแปลงค่าในฟังก์ชันไม่ส่งผลต่อ structure ต้นฉบับ
ตัวอย่างโปรแกรมที่ 1: ส่ง Structure ทั้งตัวให้ฟังก์ชัน display
#include <stdio.h>
struct date {
int day;
char month[10];
int year;
};
void display(struct date d); // รับ structure แบบ pass by value
int main() {
struct date d;
printf("ป้อนวัน เดือน ปี: ");
scanf("%d%s%d", &d.day, d.month, &d.year);
display(d); // ส่ง structure ทั้งตัว (copy)
return 0;
}
void display(struct date d) {
printf("วัน=%d\\n", d.day);
printf("เดือน=%s\\n", d.month);
printf("ปี=%d\\n", d.year);
}ผลลัพธ์
ป้อนวัน เดือน ปี: 18 JAN 2021 วัน=18 เดือน=JAN ปี=2021
ตัวอย่างโปรแกรมที่ 2: บวกค่าสมาชิกใน Structure
#include <stdio.h>
struct add {
int var1;
int var2;
};
void show(struct add a); // รับ structure แบบ pass by value
int main() {
struct add a;
printf("ป้อนตัวแปร 1 = ");
scanf("%d", &a.var1);
printf("ป้อนตัวแปร 2 = ");
scanf("%d", &a.var2);
show(a); // ส่ง structure ทั้งตัว
return 0;
}
void show(struct add a) {
int sum = a.var1 + a.var2;
printf("ผลบวกคือ %d", sum);
}ผลลัพธ์
ป้อนตัวแปร 1 = 20 ป้อนตัวแปร 2 = 50 ผลบวกคือ 70
ตัวอย่างโปรแกรมที่ 3: คำนวณคะแนนรวมนักศึกษา
#include <stdio.h>
struct student {
int s1, s2, s3;
} s[5];
void addition(struct student s[]) { // รับ array of structures
int i, sum;
for (i = 1; i < 4; i++) {
sum = s[i].s1 + s[i].s2 + s[i].s3;
printf("นักศึกษา %d ได้คะแนนรวม %d\\n", i, sum);
}
}
int main() {
int i;
for (i = 1; i < 4; i++) {
printf("ป้อนคะแนนนักศึกษา %d วิชา 1 = ", i);
scanf("%d", &s[i].s1);
printf("ป้อนคะแนนนักศึกษา %d วิชา 2 = ", i);
scanf("%d", &s[i].s2);
printf("ป้อนคะแนนนักศึกษา %d วิชา 3 = ", i);
scanf("%d", &s[i].s3);
}
addition(s); // ส่ง array of structures (decay to pointer)
return 0;
}ผลลัพธ์
ป้อนคะแนนนักศึกษา 1 วิชา 1 = 25 ป้อนคะแนนนักศึกษา 1 วิชา 2 = 89 ป้อนคะแนนนักศึกษา 1 วิชา 3 = 45 ป้อนคะแนนนักศึกษา 2 วิชา 1 = 12 ป้อนคะแนนนักศึกษา 2 วิชา 2 = 45 ป้อนคะแนนนักศึกษา 2 วิชา 3 = 89 ป้อนคะแนนนักศึกษา 3 วิชา 1 = 12 ป้อนคะแนนนักศึกษา 3 วิชา 2 = 78 ป้อนคะแนนนักศึกษา 3 วิชา 3 = 12 นักศึกษา 1 ได้คะแนนรวม 159 นักศึกษา 2 ได้คะแนนรวม 146 นักศึกษา 3 ได้คะแนนรวม 102
หมายเหตุ: ในตัวอย่างที่ 3 การส่ง array of structures จริงๆ แล้วเป็นการส่ง pointer (address) ไม่ใช่ copy ทั้ง array