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

إنشاء مصفوفة مؤشرات لبنية Struct

بدأه سلامة_2005 في 30 أكتوبر 2008 · 6 رد · 747 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

السلام عليكم يا شباب

انا احاول تعلم لغة C وفي الحقيقة واجهتني مشكلة وهي كالأتي:

قمت بإنشاء بنية struct وسميتها Rect وهي تحتوي على اربع متغيرات :

typedef struct
{
  int x,y;
  int w,h;
} Rect;

انا اريد إنشاء مصفوفة تحتوي على مؤشرات Rect حتى استطيع ان استخدمها كمعاملات من خلال الدوال

ولكي استطيع ان اعالجها بسهولة.

المشكلة :

المشكلة اني كلما حاولت ان احجز ذاكرة للمتغيرات و اخزن مؤشرها في المصفوفة احصل على خطاء وينهار البرنامج

الكود التالي للتوضيح:

int t_size = 20;
	Rect* list[t_size];
	int i=0;



	while(i<20)
	{
	  if( (list = malloc(sizeof(Rect)) == NULL) )
	  {
		  printf("\nError in malloc");
		  exit(1);
	  }
	  i++;
	}

وحتى لو كتبت الكود بالصيغة التالية فإنه لن يعمل:

int t_size = 20;
	Rect* list[t_size];
	int i=0;

	list[0] = malloc(t_size * sizeof(Rect*));

	while(i<20)
	{
	  if( list == NULL )
	  {
		  printf("\nError in malloc");
		  exit(1);
	  }
	  i++;
	}

الكود بالكامل :

#include<stdio.h>

typedef struct
{
  int x,y;
  int w,h;
} Rect;

void SetRect(Rect** r, int size);

int main()
{
	int t_size = 20;
	Rect* list[t_size];
	int i=0;

	list[0] = malloc(t_size * sizeof(Rect*));

	while(i<20)
	{
	  if( list == NULL )
	  {
		  printf("\nError in malloc");
		  exit(1);
	  }
	  i++;
	}


	SetRect(list, t_size);

	i = 0;
	while(i<t_size)
	{
	  printf("\nRect[%d]->x:%d\tRect[%d]->w:%d", i, list->x, i, list->h);
	  i++;
	  }


	getch();
	return 0;
}


void SetRect(Rect** p, int sz)
{
	int i=0;
	int j=sz;
	Rect* pRect;

	while(i<j)
	{
	  pRect = p;
	  pRect->x = 2*i;
	  pRect->y = 3*i;
	  pRect->w = 1+i;
	  pRect->h = 6+i;
	  i++;
	  }
}

main05.rar

#2

أول غلطه لاحظتها هنا

 Rect* list[t_size];

كان لازم تعطيها عدد ثابت أوإنك تعرف const int t_size أما إذا كان int متغير مايتقبله

هذا إذا كنت عرفت متغير من عندك لكن كلمة t_size محجوزه ومعرفه مسبقاً فليش تعرفها مره ثانيه؟

وهذه الغلطه الثانيه

 list[0] = malloc(t_size * sizeof(Rect*));

دالة الـ malloc لا تعيد قيمه void

أولاً أيش المطلوب بالضبط؟ مالمراد بالمصفوفه؟

تم تعديل هذه المشاركة بواسطة محمد علاو في 30 أكتوبر 2008 في 19:21


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#3
اقتباس
كان لازم تعطيها عدد ثابت أوإنك تعرف const int t_size أما إذا كان int متغير مايتقبله

هذا إذا كنت عرفت متغير من عندك لكن كلمة t_size محجوزه ومعرفه مسبقاً فليش تعرفها مره ثانيه؟

المتغير t_size انا عرفته بنفسي ولم يعطيني البرنامج اي خطاء او تحذير عن وجود متغير معرف مسبقاً بنفس الأسم

وحتى لو غيرت t_size الى my_size فالبرنامج لازال ينهار.

اقتباس
أولاً أيش المطلوب بالضبط؟ مالمراد بالمصفوفه؟

المطلوب من المصفوفة انها تحتوي على مجموعة مؤشرات من نوع struct

حتى استطيع تمرير المصفوفة كاملة من دالة الى اخرى لكي ابسط طريقة عمل البرنامج

#4

اجعل الدالة malloc تعيد من نفس نوعية المتغير المستقبل ,

(Rect*)malloc( sizeof(Rect*));

وحجم المصفوفة يكون const

قمت بتعديل بعض الاخطاء الموجودة بالكود سواء اخطاء الصياغة او الاخطاء المنطقية , واتمنى ان اكون قد فهمت قصدك في السؤال ,, تفضل :

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
typedef struct
{
  int x,y;
  int w,h;
} Rect;

void SetRect(Rect** r, int size);

int main()
{
	const int t_size = 20;
	Rect* list[t_size];
	int i=0;

	list[0] = (Rect*)malloc( sizeof(Rect*));

	while(i<t_size)
	{
	list = (Rect*)malloc( sizeof(Rect*));

	  i++;
	}


	SetRect(list, t_size);

	i = 0;
	while(i<t_size)
	{
	  printf("\nRect[%d]->x:%d\tRect[%d]->w:%d", i, list->x, i, list->h);
	  i++;
	  }


	getch();
	return 0;
}


void SetRect(Rect** p, int sz)
{
	int i=0;
	int j=sz;
	Rect* pRect;

	while(i<j)
	{
	  pRect = p;
	  pRect->x = 2*i;
	  pRect->y = 3*i;
	  pRect->w = 1+i;
	  pRect->h = 6+i;
	  i++;
	 }
}
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#5

مشكور أخي time1 على هذا التوضيح الجميل و التعديل الرائع

الله يزيدك من علمه ويفتح لك أبواب الرزق

#6

بس ليش مصمم على إنك ترسلها لدالة؟

تقدر تعرف المصفوفه فوق وأنتهى الإشكال

وبعد كذا تقدر تعدلها من اي مكان


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#7
اقتباس
بس ليش مصمم على إنك ترسلها لدالة؟

تقدر تعرف المصفوفه فوق وأنتهى الإشكال

وبعد كذا تقدر تعدلها من اي مكان

انا ما كان قصدي اني انفذ هذا البرنامج وانتهى الأمر ,, هذا البرنامج في الأعلى هو عبارة عن تمرين بسيط.

ولكن خلال كتابتي هذا التمرين واجهتني مشكلة لذلك توجب علي انا اسئل من هو أعلم مني حتى اعرف سبب الخطاء

وكيفية تفاديه .

في النهاية شكراً لك على مرورك العطر.

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