บางครั้ง คุณอาจเจอสถานการณ์หนึ่ง เมื่อคุณต้องการมีฟังก์ชัน ซึ่งสามารถรับจำนวนตัวแปรของอาร์กิวเมนต์ เช่น พารามิเตอร์ แทนที่จะเป็นจำนวนพารามิเตอร์ที่กำหนดไว้ล่วงหน้า ภาษาการเขียนโปรแกรม C/C++ จัดเตรียมวิธีแก้ปัญหาสำหรับสถานการณ์นี้ และคุณได้รับอนุญาตให้กำหนดฟังก์ชันที่ยอมรับตัวแปรจำนวนตัวแปรตามความต้องการของคุณ ตัวอย่างต่อไปนี้แสดงคำจำกัดความของฟังก์ชันดังกล่าว
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
ควรสังเกตว่าฟังก์ชัน func() มีอาร์กิวเมนต์สุดท้ายเป็นวงรี นั่นคือ จุดสามจุด (...) และจุดก่อนหน้าจุดไข่ปลาจะเป็น int เสมอ ซึ่งจะแสดงจำนวนอาร์กิวเมนต์ตัวแปรจำนวนทั้งหมดที่ส่งผ่าน หากต้องการใช้ฟังก์ชันดังกล่าว คุณต้องใช้ stdarg.h ไฟล์ส่วนหัวซึ่งมีฟังก์ชันและมาโครเพื่อใช้การทำงานของอาร์กิวเมนต์ตัวแปรและทำตามขั้นตอนที่กำหนด -
- กำหนดฟังก์ชันที่มีพารามิเตอร์สุดท้ายเป็นวงรี และหนึ่งก่อนจุดไข่ปลาจะเป็น int เสมอ ซึ่งจะแสดงจำนวนอาร์กิวเมนต์
- สร้าง va_list พิมพ์ตัวแปรในนิยามฟังก์ชัน ประเภทนี้ถูกกำหนดไว้ในไฟล์ส่วนหัว stdarg.h
- ใช้ int พารามิเตอร์และ va_start มาโครเพื่อเริ่มต้น va_list ตัวแปรไปยังรายการอาร์กิวเมนต์ แมโคร va_start ถูกกำหนดในไฟล์ส่วนหัว stdarg.h
- ใช้ va_arg มาโครและ va_list ตัวแปรเพื่อเข้าถึงแต่ละรายการในรายการอาร์กิวเมนต์
- ใช้มาโคร va_end เพื่อล้างหน่วยความจำที่กำหนดให้กับ va_list ตัวแปร.
ตอนนี้ให้เราทำตามขั้นตอนข้างต้นและเขียนฟังก์ชันง่าย ๆ ที่สามารถนำจำนวนตัวแปรของพารามิเตอร์และคืนค่าค่าเฉลี่ยของพวกมัน -
ตัวอย่าง
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; va_start(valist, num); //initialize valist for num number of arguments for (i = 0; i < num; i++) { //access all the arguments assigned to valist sum += va_arg(valist, int); } va_end(valist); //clean memory reserved for valist return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f", average(3, 5,10,15)); }
ผลลัพธ์
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000