القائمة الرئيسية

الصفحات

C - Variable Arguments

 في بعض الأحيان ، قد تصادف موقفًا ، عندما تريد الحصول على وظيفة ، والتي يمكن أن تأخذ عددًا متغيرًا من الوسائط ، مثل المعلمات ، بدلاً من عدد محدد مسبقًا من المعلمات. توفر لغة البرمجة 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;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }
	
   /* clean memory reserved for valist */
   va_end(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\n", average(3, 5,10,15));
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية. وتجدر الإشارة إلى أنه تم استدعاء متوسط الوظيفة () مرتين وفي كل مرة تمثل الوسيطة الأولى العدد الإجمالي لوسائط المتغير التي يتم تمريرها. سيتم استخدام علامات الحذف فقط لتمرير عدد متغير من الوسائط.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
الصفحة التالية                                                                              الصفحة السابقة  
هل اعجبك الموضوع :

تعليقات