Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

อาร์กิวเมนต์ความยาวตัวแปรใน C


บางครั้ง คุณอาจเจอสถานการณ์หนึ่ง เมื่อคุณต้องการมีฟังก์ชัน ซึ่งสามารถรับจำนวนตัวแปรของอาร์กิวเมนต์ เช่น พารามิเตอร์ แทนที่จะเป็นจำนวนพารามิเตอร์ที่กำหนดไว้ล่วงหน้า ภาษาการเขียนโปรแกรม 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