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

[تمت الإجابة]سؤال : ما البديل عن التمرير بالمرجع في C

بدأه tantie L في 14 نوفمبر 2013 · 5 رد · 658 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته...


أساتذتي اخواني أخواتي...


في البرنامج الذي أعمل عليه أواجه صعوبة في عملية التمرير بالمرجع و هذا على حسب ما قرأت عائد الى المترجم فعلى ما يبدو أن المترجم المثبت عندي ﻻ يحتك بسي بلس بلس 


هذه كيفية تعريفي للقائمة


typedef struct joueur

{

char n[20];

char p[20];

char pl;

int pr;

struct joueur* ptrn;

}J;

int init(J &pp)

و لكن عند الترجمة يظهر لي المترجم الرسالة التالية


quipe 2.c|12|error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token|

فبماذا أستبدل هذه الطريقة للتعريف؟ و ان كانت طريقة التعريف بالمؤشرات الثابتة فهلا تكرمتم علي بكيفيتها؟


و الله وكيل ثوابكم 


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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#2

أنت تستخدم gcc، مصرف c، إذا كنت تريد مصرف c++ يلزم استخدم g++ لبناء البرنامج.

 

c لاتدعم التمرير بالمرجع، هناك ثلاث أساليب يمكن إستخدامها لتهئية البنية:

 

تمرير مؤشر للبنية:

/*
 * J pp;
 * j_init(&pp);
 */
int j_init(J *pp) {
  /* initialize pp */
  return 0;
}

إعادة نسخة من البنية (إسلوب غير شائع):
/*
 * J pp = j_init2();
 */
J j_init2(void) {
  J pp;
  /* initialize pp */
  return pp;
}

 

إنشاء نسخة ديناميكية من البنية، أفضل لأخفاء تفاصيل البنية عن المستخدم:

/*
 * J *pp;
 * pp = j_new();
 * j_free(pp);
 */
J* j_new(void) {
  J* pp;
  if( (pp = calloc(1, sizeof(J))) == NULL )
    return NULL;
  /* initialize pp */
  return pp;
}

void j_free(J* pp) {
  if(pp) free(pp);
}

 

يستحسن دوماً استخدام أسماء معبرة للدوال والمتغيرات، n، p، J أسماء لاتحمل معنى.

3
#3

أشكرك أستاذي الكريم على اجاباتك الرائعة

أظن أنني سأستعمل الأولى لأنني فهمتها بنسبة 70% أما البقية فلا

أنا أستخدم اختصارات للأسماء فقط 

ف n : nom

p : prénom

j : joueur

init : initialisation

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#4

شكرا لك أخي Mr.BH

أختي بالنسبة للطريقة الثانية

اقتباس

إعادة نسخة من البنية (إسلوب غير شائع):

فهي بسيطة جداً .. وتعني إنشاء البنية داخل التابع ثم إرجاعها بـreturn  ولكن أظن انها لا تجيب سؤالك .. فسؤالك عن تمرير بنية للتابع وليس عن إرجاعها منه حسب ما فهمت ..

أما الطريقة الثالثة :

اقتباس

إنشاء نسخة ديناميكية من البنية

وتعني إنشاء البنية في الــHeap والإشارة لها بمؤشر وإعادة عنوان البنية وبالتالي يمكنك استخدامها عند حصولك على عنوانها .

 

بالتوفيق

#5

هناك طريقة متعارف عليها، يمكنك إستخدامها لتجاوز جميع هذه المشاكل والتركيز على الكود، وهي نفس الطريقة التي يستخدمها نظام الويندوز في التعامل مع الـ Structs  ;)

typedef struct _JOUEUR
{
	char n[20];
	char p[20];
	char pl;
	int pr;
	struct _JOUEUR *next;
}
JOUEUR, *PJOUEUR;

// passing parameter as a pointer to struct
int Init_Pointer(PJOUEUR pJoueur)
{
	int value;
	// do something
	return value;
}

// passing parameter as struct
int Init_Struct(JOUEUR sJoueur)
{
	int value;
	// do something
	return value;
}

int main (void)
{
	// define struct
	// s: for struct
	JOUEUR sJoueur;

	// define pointer to struct
	// p: pointer to struct
	PJOUEUR pJoueur;

	// calling Init_Pointer
	Init_Pointer(pJoueur);

	// calling Init_Struct
	Init_Struct(sJoueur);

	getchar ();
	return 0;
}
2
#6

أخي zirek99i بارك الله فيك على اجابتك أشكرك أخي الكريم فقد وضحت لي جزء كبيرا جدا من الغموض الذي كنت أشعر به حيال كيفية التمرير بدون مرجع 

باذن الله سأحاول تطبيق ما أخبرتني به

جزاك الله عني كل الخير أنت و الاخوة الكرام الذين أجابوني

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…