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

arrgmentes in function

مغلق
بدأه بطران في 17 ديسمبر 2002 · 8 رد · 812 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

كيف يمكن كتابة دوال تتقبل عدد محدد من pramter و لكن دون تحديد النوع

void function ( type *var1 , type *var2);

لاحظوا إني أبي عدد محدد مو مفتوح زي

printf("...",...);//Like this

و طبعا كل هذا أبيه على السي إذا ممكن .

تحياتي للجميع بطران.

014.gif
#2

تحتاج أن تستعين بالـ Templates

template <class T>

void printout (T var1, T var2);

عندها يمكنك أن تضع مكان var1 و var2 متغير من أي نوع

#3

هذا سي++ و ليس سي :)

#4

مشكور .. اخوي ... بس هنا المشكلة ..أنا أبي هذا بالسي

و إلا أعرف إنه ممكن في سي++

مشكور جدا .. و بالتوفيق

014.gif
#5

يمكنك استخدام مؤشر من نوع void .. لكن يجب ان تُبلغ الدالة بالنوع الذي ستبعث به.. مثلا :

function (void *x, char type)

{

  switch (type)

   {

     case 'i' : { *((int *)x)+=1; break;}

     case 'L' : { *((long *)x)+=1; break;}

     case 'f' : { *((float *)x)+=1; break;}

     case 'd' : { *((double *)x)+=1; break;}

  }

}

آسف على هذه الطريقة البدائية.. لكن هذا ما اسعفتني به معرفتي في سي.

طبعا البرنامج يأخذ من المستخدم الرقم ويطلب من المستخدم تحديد النوع.

#6

السلام عليكم ....

أولا عليك ان تعرف ان هذه الأسلوب من البرمجة غالبا ماهو سليم! و يؤدي إلى الكثير من المشاكل، وو جود ال type checker في المترجم compiler ليس عبثا .... ولكن لحمايتنا من المشاكل التي تنتج من هذا النوع من البرمجة .

و لكن بالفعل في بعض الحالات نجد اننا نحتاج إلى دالة تستقبل بارمترات من data type غير محددة، و لغة السي للأسف لم توفر طريقة Safe لعمل هذا الدوال.

هناك اكثر من طريقة، الأولى كما قال اسماعيل ... تكون بجعل الدالة تستقبل مؤشر إلى void، و لكن يجب ان ترسل النوع معها ! لانك في جسم الدالة لن تستطيع ان تعرف ماهو نوع المتغير المرسل.

الطريقة الثانية و هي ال union، و تكون ببناء union ضخم تسميه Variant مثلا، و تجعل الحقول فيها جميع الأنواع التي تتوقع استقبالها، ثم تعريف متغير من نوع Variant داخل struct ، و يحتوي هذا struct على عضو يحدد اي من الحقول في union هو ال active .

يعني بكلام أخر، تقوم بالتالي :

union Variant

{

   unsigned char bVal; 

   short iVal; 

   long lVal; 

   float fltVal;.

   double dblVal;

   unsigned char * pbVal;

   short * piVal; 

   long * plVal; 

   float * pfltVal; 

   double * pdblVal; 

   void * byref;

}



enum Type { SHORT, LONG, LONGPTR, DOUBLE, DOUBLEPTR, VOIDPTR 

..... }



struct 

{

   Type type;

   Variant data;

}

طبعا لو تنتقبل لسي++ يكون افضل، لانه توفر طريقة اسهل و افضل و اكثر امان .

تقبل تحياتي ....

#7

السلام عليكم ...

أخوي اسماعيل .. لو أقدر أعرف شيء يدل على النوع كان استقبلت نوع كبرميتر للداله ... يعني أنا أبي طريقة تتمكن من تحديد النوع بدون تدخلي أنا .

الأخ حسام .. لا يخفاك أن لغة C كله تعد لغة غير آمنة ( حسب رأي البعض) .. و لكن صدقني ما قد تراه غير سليم قد يكون سليم في بعض الحالات فمثلا أنا أرديد دالة genaric قادرة على استقبال أي نوع من أنوع المغيرات بل .. و حتى user define data type . وبعد ذلك تقوم هذه الدوال بعملها بغض النظر عن أي شيء .

الفكرة التي طرحتها صراحه لم تخطر ببالي .. و لكنها قمة في الإبداع.

عموما شاكر للجميع المساعدة .. واللي عنده حلول زيادة يساعدنا بها.

014.gif
#8

السلام عليكم .....

اخي بطران، اطلع على ال STL إذا كنت مهتم بال Generic Programming

تقبل تحياتي ...

#9

ممكن لو عندك مواضيع سابقة عنها تكون ساعدتني كثير ... لأني لقيت مواضيع كثيرة .. بس .

و اكرر شكري لك مرة ثانية.

ولازلت استقبل أفكار بلغة السي .

طرأت في بالي فكرة جديدة .. أتوقع إن أغلب الدوال المعرفة من المنتج مكتوبة بحيث تقبل أي نوع بيانات ( struct - data types )

i think if we can see how they wrote these function we may come with a solution .... any one agreed .

014.gif

هذا الموضوع مغلق.

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