สมมติว่าเราต้องการสร้างฟังก์ชันบางอย่างที่สามารถรับหลายอาร์กิวเมนต์ได้ ไม่มีจำนวนอาร์กิวเมนต์ที่แน่นอน เราต้องการสร้างฟังก์ชันสามฟังก์ชัน sum(), max() และ min() ซึ่งสามารถคำนวณผลรวมของตัวเลข จำนวนสูงสุด และจำนวนขั้นต่ำที่กำหนดตามลำดับ แต่ละฟังก์ชันเหล่านี้จะนับจำนวนอาร์กิวเมนต์เป็นอาร์กิวเมนต์แรก เพื่อกำหนดประเภทของฟังก์ชันนี้ เราจำเป็นต้องใช้จุดไข่ปลา (...) สามจุดในอาร์กิวเมนต์ของฟังก์ชัน ในการใช้งานเราจะต้องรวมไฟล์ส่วนหัว stdarg.h ฟังก์ชันประเภทนี้เรียกว่าฟังก์ชันตัวแปร ในการเข้าถึงตัวแปรอาร์กิวเมนต์ มีสี่สิ่งที่เราอาจสังเกตเห็น -
-
va_list :เก็บอาร์กิวเมนต์ที่กำหนดทั้งหมด
-
va_start :สิ่งนี้จะเริ่มเข้าถึงตัวแปร ap อาร์กิวเมนต์ของตัวแปร
-
va_arg :ใช้เพื่อดึงอาร์กิวเมนต์ถัดไปของประเภทที่กำหนด
-
va_end :สิ้นสุดการเข้าถึงรายการอาร์กิวเมนต์ตัวแปร
ดังนั้น หากเราเรียกฟังก์ชันเช่น −;
- ผลรวม(5, 5, 2, 8, 9, 3)
- สูงสุด(3, 5, 9, 2)
- นาที(6, 8, 5, 2, 6, 7, 9)
จากนั้นผลลัพธ์จะเป็น 27 (ผลรวมของตัวเลขทั้ง 5 ตัว), 9 (ค่าสูงสุดของตัวเลข 3 ตัว), 2 (ค่าต่ำสุดของตัวเลข 6 ตัว)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดผลรวมของฟังก์ชัน () ซึ่งจะใช้ cnt และจำนวนตัวแปรของอาร์กิวเมนต์
- กำหนด va_list ap
- เริ่มต้น ap โดย va_start(ap, cnt)
- n :=0
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- n :=n + อาร์กิวเมนต์ถัดไปโดย va_arg(ap, int)
- ขั้นต่ำ :=ปัจจุบัน
- สูงสุด :=ปัจจุบัน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <stdio.h> #include <stdarg.h> int sum (int cnt,...) { va_list ap; int i, n; va_start(ap, cnt); n = 0; for (i=0;i<cnt;i++){ n += va_arg(ap, int); } va_end(ap); return n; } int min(int cnt,...) { va_list ap; int i, current, minimum; va_start(ap, cnt); minimum = 99999; for (i=0;i<cnt;i++){ current = va_arg(ap, int); if (current < minimum) minimum = current; } va_end(ap); return minimum; } int max(int cnt,...) { va_list ap; int i, current, maximum; va_start(ap, cnt); maximum = 0; for (i=0;i<cnt;i++){ current = va_arg(ap, int); if (current > maximum) maximum = current; } va_end(ap); return maximum; } int main(){ printf("%d\n",sum(5, 5, 2, 8, 9, 3)); printf("%d\n",max(3, 5, 9, 2)); printf("%d\n",min(6, 8, 5, 2, 6, 7, 9)); }
อินพุต
sum(5, 5, 2, 8, 9, 3) max(3, 5, 9, 2) min(6, 8, 5, 2, 6, 7, 9)
ผลลัพธ์
27 9 2