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

ماهي المشكلة في هذا البرنامج؟!..أرجوكم!

مغلق
بدأه programer_su في 20 مارس 2005 · 11 رد · 993 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أرجوكم يا جماعة ماهي المشكلة في هذا البرنامج ..ال(compiler) لم لم يعطيني خطأ ولكن إذا نفذته وأدخلت الdataالأولى يقولى:تسبب البرنامج...في حدوث خطأ وسوف يتم إغلاقه.....إلى آخر السمفونية المقيتة :wacko: ,هل المشكلة في الفيجوال أم بخطأ لم يكتشفه ال(compiler)

#include<stdio.h>
#include<stdlib.h>

struct intstack
{
	int *AryStack;
	int count;
	int maxary;
	int top;
};



struct intstack* createstack(int maxelements)
{
	struct intstack *stack;

	stack=(struct intstack*)malloc(sizeof(struct intstack));

	if(stack==NULL)

  return NULL;


	stack->count=0;
	stack->top=-1;
	stack->maxary=maxelements;

	stack->AryStack=(int*)malloc(sizeof(int)*maxelements);


	if(stack->AryStack==NULL)

  free(stack);
  return NULL;


  return stack;

}


int pushstack(struct intstack *stack,int datain)
{

	if(stack->count==stack->maxary)

  return 0;


	(stack->count)++;
	(stack->top)++;


	stack->AryStack[stack->top]=datain;

     return 1;

}


int popstack(struct intstack *stack,int *dataout)
{

	if(stack->count==0)

  return 0;


	*dataout=stack->AryStack[stack->top];


	(stack->count)--;
	(stack->top)--;

     return 1;

}


int topstack(struct intstack *stack,int *dataout)
{

	if(stack->count==0)

  return 0;


	*dataout=stack->AryStack[stack->top];


     return 1;

}


int emptystack(struct intstack *stack)
{

	return (stack->count==0);

}

int fullstack(struct intstack *stack)
{

	return (stack->count==stack->maxary);

}


void main()
{

	struct intstack *mystack;

	int i;

	int value;


	mystack=createstack(10);



	while(1)
	{
  printf("stack manipulation:\n\n");

  printf("1.Push\n");
  printf("2.Pop\n");
  printf("3.Pop\n");
  printf("4.End\n\n");
  scanf("%d",&i);


  if(i==1)
  {
 	 printf("Value?");
 	 scanf("%d",&value);

 	 if(pushstack(mystack,value))

       printf("value%dpushed in\n",value);

 	 else

    printf("stack is full");

  }


  else if(i==2)
  {
 	 if(popstack(mystack,&value))

    printf("value %d poped\n",value);

 	 else
    printf("stack is Empty\n");

  }


  else if (i==3)
  {

 	 if(topstack(mystack,&value))

    printf("value on the top is %d\n",value);

 	 else
    printf("stack is Empty \n");

  }


  else

 	 return;

	}


}

تم تعديل هذه المشاركة بواسطة احمد غريب في 20 مارس 2005 في 21:10

#2

moha1.jpg

اخي والله اعلم الخطا بالكمبايلر

والصورة اللي فوق هيي لبرنامجك

:lol:

52gv0m.gif
#3

شكرا لك أخي نوري_86...

- خرجت لي الشاشة السوداء , كما في الصورة التي أرفقتها ,ولكن عندما أدخل قيمة(أختار رقم 1 مثلا) ثم أضغط enter...تخرج الرسالة :تيبب برنا مجك في حدوث خطأ ,وسوف يتم إيقاف التشغيل.......الخ

-إذا كانت المشكلة في compiler ماهو الحل؟

#4

السلام عليكم

ضع return فى اخر البرنامج قبل إغلاق القوس الاخير, مازلت اتفحص الكود وإن شاء الله اعود لو وجدت اخطاء اخرى.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

السلام عليكم

الخطاء في دالة البناء لكي تتأكد من ذلك ضع هذا السطر في الدالة main بعد بناء ال stack

printf("%d\t%d\t%d\n",mystack->count,mystack->maxary,mystack->top);

سوف تجد أن count , maxary, top ليس لها قيم

ولتتأكد من ذلك أكثر شغل ال debug وشاهد القيم الثلاث السابقة

ولا تحزن لقد حددت الخطأ

أحذف الثلاث الأسطر التالية

if(stack->AryStack==NULL)

 free(stack);
 return NULL;

تم تعديل هذه المشاركة بواسطة the smart programmer في 20 مارس 2005 في 22:09

#6
احمد غريب كتب:
السلام عليكم

ضع return  فى اخر البرنامج قبل إغلاق القوس الاخير, مازلت اتفحص الكود وإن شاء الله اعود لو وجدت اخطاء اخرى.

والسلام

شكرا ياأخي أحمد غريب..

وضعت return بعد قوس whileوقبل القوس الأخير ..ولكن لم يتغير شئ..لأنه سيخرج أصلا ب(else)(return)..

#7
the smart programmer كتب:
السلام عليكم

ولا تحزن لقد حددت الخطأ

أحذف الثلاث الأسطر التالية

if(stack->AryStack==NULL)

 free(stack);
 return NULL;

تسلم والله:D ..ألف شكر أخي the smart programmer...

الحقيقة إن الخطأ هو كما ذكرت تقريبا وهو: أني لم أضع أقواس لif,وبالتالي سوف يفهم السيد : compilerأن (return NULL) ليست تبع if)( ..

..ويجب أن لا أحذف if لأني أبغاها تتأكد أن AryStack حجزت في الذاكرة...

شكرا لجميع الإخوة اللي فزعوا معي...

#8

السلام عليكم

المهم أنك عرفت الخطأ وأستفدت منه

فالعلم لا يأتي إلا عن طريق الخطأ والصواب

#9

ما هو الكومبايلر اللذي تستخدمه؟

حاول تعلم استخدام debugger لأنك تستطيع بواسطته تتبع تنفيذ الكود لكي تحاول ان تعرف من أين يأتي الخطأ,

#10
hasan_aljudy كتب:
ما هو الكومبايلر اللذي تستخدمه؟

حاول تعلم استخدام debugger لأنك تستطيع بواسطته تتبع تنفيذ الكود لكي تحاول ان تعرف من أين يأتي الخطأ,

عفوا يا عزيزي hasan_aljudy ..أرجوك أن تفيدني وتصحح معلوما تي..

-الذي أعرفه أن لكل لغة compiler واحد فقط..

-ماهو debugger ,وكيف أحصل عليه؟..

وشكرا لك..

#11
programer_su كتب:
عفوا يا عزيزي hasan_aljudy ..أرجوك أن تفيدني وتصحح معلوما تي..

-الذي أعرفه أن لكل لغة compiler واحد فقط..

-ماهو debugger ,وكيف أحصل عليه؟..

وشكرا لك..

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

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

بالنسبة للـdebugger هو برنامج يسمح لك بتحميل برنامجك و متابعت تنفيذه سطرا سطرا و مراقبة المتغيرات .. الخ.

أنا أستخدم microsoft visual studio و هو IDE يحتوي على compiler و debugger و أشياء أخرى.

مثلا الكود اللذي كتبته انت, قمت بعمل debug عليه و لاحظت حصول خطأ, سببه ان المتغير stack في أحد الـ functions هو NULL pointer يعني مؤشر قيمته صفر (لا يشير الى شيء) و انت تحاول استخدامه.

قمت بإيقاف البرنامج و حاولت تشغيله من البداية , مع السير فيه خطوة خطوة, فلاحظت انه داخل createstack() هناك سطر يقوم بإرجاع NULL (و هو نفس السطر اللذي نبهك عليه الإخوة هنا).

سأحاول تحميل فيديو صغير يوضح العملية إن شاء الله.

يمكنك تحميل الملف من هنا (حجمه أقل من 500 كيلوبايت)

رجاءا أخبرني عندما تحمله لأني لا أستطيع إبقائه لفترة طويلة.

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 22 مارس 2005 في 00:51

#12
hasan_aljudy كتب:
الكومبايلر مجرد برنامج يقوم بتحويل البرنامج الى لغة الألة, يعني الكومبايلر مجرد برنامج, لذلك ممكن جدا ان هناك عشر كومبايلرات مختلفة.

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

بالنسبة للـdebugger هو برنامج يسمح لك بتحميل برنامجك و متابعت تنفيذه سطرا سطرا و مراقبة المتغيرات .. الخ.

أنا أستخدم microsoft visual studio و هو IDE يحتوي على compiler و debugger و أشياء أخرى.

مثلا الكود اللذي كتبته انت, قمت بعمل debug عليه و لاحظت حصول خطأ, سببه ان المتغير stack في أحد الـ functions هو NULL pointer يعني مؤشر قيمته صفر (لا يشير الى شيء) و انت تحاول استخدامه.

قمت بإيقاف البرنامج و حاولت تشغيله من البداية , مع السير فيه خطوة خطوة, فلاحظت انه داخل createstack() هناك سطر يقوم بإرجاع NULL (و هو نفس السطر اللذي نبهك عليه الإخوة هنا).

سأحاول تحميل فيديو صغير يوضح العملية إن شاء الله.

يمكنك تحميل الملف من هنا (حجمه أقل من 500 كيلوبايت)

رجاءا أخبرني عندما تحمله لأني لا أستطيع إبقائه لفترة طويلة.

شكرا لك يا أخي hasan_aljudy...

لقد حملت الملف..

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

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

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

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

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

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