วิธีนี้ส่ง สมาชิกแต่ละตัวของ Struct แยกกันเป็นพารามิเตอร์ เรียกว่า Pass by Value สำหรับแต่ละสมาชิก
หลักการ
- ส่งสมาชิกแต่ละตัวใน Function Call:
func(s.sno, s.sname, s.marks) - รับใน Function Header ด้วยตัวแปรธรรมดา:
void func(int no, char name[], float mk)
ตัวอย่างโปรแกรม: คำนวณคะแนนรวมนักเรียน
#include <stdio.h>
struct student {
int s1, s2, s3;
} s[5];
// ฟังก์ชันรับคะแนน 3 วิชา คำนวณรวม
void addition(int a, int b, int c) {
int sum = a + b + c;
printf("Total = %d\n", sum);
}
int main() {
int i;
// รับข้อมูลนักเรียน 3 คน
for(i = 0; i < 3; i++) {
printf("Student %d:\n", i+1);
printf("Subject 1: "); scanf("%d", &s[i].s1);
printf("Subject 2: "); scanf("%d", &s[i].s2);
printf("Subject 3: "); scanf("%d", &s[i].s3);
}
// เรียกฟังก์ชันส่งสมาชิกแต่ละตัว
for(i = 0; i < 3; i++) {
printf("Student %d: ", i+1);
addition(s[i].s1, s[i].s2, s[i].s3);
}
return 0;
}
ผลลัพธ์
Student 1: Subject 1: 80 Subject 2: 75 Subject 3: 90 Student 1: Total = 245 Student 2: Total = ... ...
ข้อดี-ข้อเสีย
| ข้อดี | ข้อเสีย |
|---|---|
| เข้าใจง่าย โค้ดอ่านง่าย | ถ้า Struct มีสมาชิกเยอะ จะต้องส่งพารามิเตอร์เยอะ |
| เหมาะกับ Struct ขนาดเล็ก | ไม่สามารถแก้ไขค่าใน Struct ตัวจริงได้ (Pass by Value) |
| ไม่ต้องรู้โครงสร้าง Struct ในฟังก์ชัน | โค้ดยาวเมื่อ Struct ใหญ่ |
เมื่อไหร่ควรใช้วิธีไหน?
- ส่ง Struct ทั้งอัน (Pass by Reference): Struct ใหญ่, ต้องแก้ไขค่า, เน้นประสิทธิภาพ
- ส่งสมาชิกแยกต่างหาก: Struct เล็ก, ไม่ต้องแก้ไขค่า, ต้องการความชัดเจน