الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تمرير متغيرات غير معلومة العدد لتابع multiple arguments

بدأه aohammed في 16 يوليو 2010 · 5 رد · 961 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي سؤال حول multiple arguments " تمرير عدد لا نهائي من المتغيرات للتابع "

int add(int x,...)
{

}
void main()
{
cout<<add(5,3);
cout<<add(7,3,10);
cout<<add(8,2,11,6);
}

مثال أخر : printf(

scanf(

حيث أنهما يقبلان عدد غير محدود من البارامترات

حيث أنني بحثت عنه قليلا ً في المواقع الأجنبية لكنني لم أستفد

فهل من الممكن شرح بسيط عنها في الطريقتين

1- Linked List

2- طريقة استخدام ...

va_list
va_start
va_arg
va_end

حسبما قرأت وجدت أنه يجب استخدام المايكرو التالية الموجودة في المكتبة #include<stdarg.h> :

مع الشكر

#2

السلام عليكم

هل تقصد اخي العزيز انك تعرف Function

لكن تقبل عدد لا نهائي من المتغيرات ؟

#3

وعليكم السلام

هذا الموضوع كتبت عنه مسبقا هنا

/index.php?showtopic=165904

في مكتبات مثل Qt لا يستخدمون هذه الطريقة بتاتا مع الدوال لا أدري هل هو عيب فيها !؟؟ بينما يستخدمون طريقة أخرى وهي انك تعطيهم ال array و عدد عناصرها .

واعتقد انها الطريقة الأفضل .

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#4

عائلة الداله printf لها عدة صيغ ما يهمنا منها الأن هو التالى:

int printf ( const char * format, ... );
int vprintf ( const char * format, va_list arg );

بشكل افتراضى الداله printf تقوم بإستدعاء الداله vprintf و التى بدورها تستدعى اخرين للطباعه و لكن ما يهمنا الأن هو كيف يبدو الكود داخل الداله printf

int printf ( const char * format, ... )
{
  va_list lst;
  va_start(lst, format);

  return vprintf(format, lst);
}

بشكل بسيط النوع va_list هو اسم بديل لـ char* ويتم تخزين به عنوان ثانى معامل تم تمريره للداله (فى حالتنا هنا عووان المعامل بعد format) علية الحصول على المعامل نفسه تكون بإستدعاء الماكرو va_start و الذى يأخذ منك اول معامل تم تمريره للداله و متغير من نوع va_list ليضع داخله عنوان المعامل الذى يليى الأول.

فى الداله printf يتم عمل متغير اسمه lst من نوع va_list بعدها يتم استخدام الماكرو va_start لوضع عنوان اول معامل بعد format داخل list بعدها يتم تمرير المعامل format و المتغير va_list للداله vprintf لتقوم بما تقوم به.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 16 يوليو 2010 في 16:01

مدونتي: C++ Tips and Tricks

#5

شكرا ً لكم

لكن سؤال أخير حسب ما فهمت منكم لحساب مجموع أرقام

#include "stdafx.h"
#include<iostream>
#include<stdarg.h>
using namespace std;
	int add( int size, ... ) 
	{
  	int sum = 0;
  	va_list v;
  	va_start( v, size );

  	while(size!=0){
    	sum += va_arg( v, int );
		size--;
  	}

  	va_end( v );

  	return( sum );
	}

	int main( void ) {

  	cout<< add( 4,5,6,1,2 )<<endl;
  	cout<< add( 3,1,10,6)<<endl;
	  cout<< add(6,7,8,2,4,5,9)<<endl;
	int i;cin>>i;
  	return( 0 );
	}

أنا مجبر بوضع الـsize

لكن هل من طريقة لجعل هذا الأمر ديناميكي ؟

أو مثلا ً الإيقاف عندما يصل إلى 0 ؟؟ حاولت في هذا الأمر لكن لم أفلح بسبب خطأ في العنونة

مع الشكر لكم

#6
اقتباس
لكن هل من طريقة لجعل هذا الأمر ديناميكي ؟

و هل توجد ديناميكيه اكثر من ذلك :excl:

و إذا افترضنا انك لم تقم بتمرير المعامل size حينها ستواجهك مشكلتان اولهم انك لن تعرف مكان اول معامل و بالتالى لن تستطيع الوصول للثانى و لا الثالث و هكذا و المشكله الثانيه على افتراض انك عرفت موقع المعامل الأول بطريقه ما كيف ستعرف عدد المعاملات التى تم تمريرها.

اغلب الدوال التى تتعامل مع variable arguments تأخذ من المستخدم عددهم بشكل ما فمثلا الداله printf تعرف عدد المعاملات من النص (بالتحديد الذى يسبقهم % ماعدا %%)، و حيث ان دالتك تتعامل مع الأرقام فقط فلابد من ان تدخل لها عدد المعاملات كأول معامل.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

مواضيع مشابهة