السلام عليكم و رحمة الله و بركاته اخواني اخواتي اساتذتي الكرام
من بعد اذنكم ارجو منكم ان تساعدونني على معرفة الخطأ في هذا الكود
هدف هذا الكود هو محاكاة استراتيجية FIFO التي يتبعها مسير الذاكرة لتحميل البرامج المتربصة الى الذاكرة ليتم تشغيلها و هي تعتمد على طريقة اول الواصلين هو اول الخارجين او المحملين من اجل التنفيذ، كتبت الكود و نفذته مرتين الاولى نجحت و الثانية لم تنجح فحاولت معرفة السبب و اصلاحه لكنني لم استطع ذلك، لذلك فضلا منكم اخوتي اساتذتي هل يمكنكم مساعدتتي على معرفة هذا الخطأ و ما الطريقة لتصحيحه؟ و الله وكيل اجركم و ثوابكم
هذا هو الكود، كله يعتمد على القوائم لانه المطلوب، اعلم انه طويل جدا فاسطره 250 لكن ما باليد حيلة هذا ما تمكنت منه :blush:
#include<stdio.h>#include<stdlib.h>typedef struct liste//القائمة الخاصة بسلسلة المرجع{ int a; struct liste *ptrn;}chaine_ref;typedef struct liste1//القائمة الخاصة بعدد الامكنة المحدد للبرنامج{ int a,age,Dp;//المتغير 1 خاص بمحتوى الخانة و 2 خاص بمدة مكوث جزء البرنامج في تلك الخانة و 3 عدد مرات تحميل الصفحات او اجزاء البرنامج struct liste *ptrn;}case_memoire;chaine_ref *criation_chaine(chaine_ref *tete)//ايجاد سلسلة المراجع{ chaine_ref *p,*n_m; int x,i=0; tete=NULL; p=tete; while(i!=-1)//شرط التوقف { p=(chaine_ref*)malloc(sizeof(chaine_ref)); printf("entrer le numero de page svp : "); scanf("%d",&x); p->a=x; p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; printf("(si vous voulez arriter ecrivez -1) : "); scanf("%d",&i); } return tete;}void aff_chain_ref(chaine_ref *tete)//الدالة الخاصة بطباعة السلسة المرجعية{ chaine_ref *p; p=tete; printf("la chaine de reference est :\n"); while(p!=NULL) { printf("%d ",p->a); p=p->ptrn; }}case_memoire *criation_case(case_memoire *tete,int n)//ايجاد القائمة الخاصة بمحتوايات حصة البرنامج من الذاكرة{ case_memoire *p,*n_m; int i=0; tete=NULL; p=tete; while(i<n) { p=(case_memoire*)malloc(sizeof(case_memoire)); p->a=-1;//قيم ابتدائية للمساعدة p->age=0;//نفس الشيء p->Dp=n;//اول قيمة لعدد مرات تحميل صفحات البرنامجو هو عدد الخانات المخصصة للبرنامج في الذاكرة p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; i++; } return tete;}case_memoire *nbr_defaut_page(case_memoire *tete)//الدالة التي تحسب عدد مرات تحميل صفحات البرنامج{ case_memoire *p; p=tete; while(p!=NULL) { p->Dp++; p=p->ptrn; } return tete;}void aff_case_memo(case_memoire *tete)//الدالة التي تطبع محتويات حصة البرنامج من الذاكرة{ case_memoire *p; p=tete; printf("\n:::::::::::::::::::::::::::::\n"); while(p!=NULL && p->a>=-1 && p->a<=9 && p->age>-1 && p->age<=9)//شرط طباعة المحتويات لانه في بعض الاحيان عندما تكون هناك خانات متبقية من حصة البرنامج في الذاكرة في المرحلة الاخيرة فانه يظهر محتوى عشوائيو انا لا اريده { printf("%d\n",p->a); p=p->ptrn; }}case_memoire *mis_a_jour(case_memoire *tete)// الدالة التي تقوم بتحديث مدة مكوث مراجع الصفحات في خانات الذاكرة{ case_memoire *p; p=tete; while(p!=NULL) { p->age++; p=p->ptrn; } return tete;}case_memoire *ptr_max(case_memoire *tete,int *t)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{ case_memoire *p,*max; p=tete; max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة while(p!=NULL) { if(p->age>=max->age) { max=p; p=p->ptrn; } else p=p->ptrn; } p=tete; while(p!=NULL && p!=max && p->a!=t[1])// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة { p=p->ptrn; } if(p->a==t[1])//هنا مشكلتي و هي احيانا تنجح و احيانا ﻻ و هي ان وجد البرنامج اية قيمة مساوية لاول قيمة في جدول السلسلة فانه يعيد القائمة كما هي و يغادر لكنها لا تعمل جيدا { return tete; } if(p==max)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث { if(p->a!=t[1])//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية { p->age=0;//اعيد عمره صفرا p->a=t[1];//و اسند اول قيمة في الجدول له tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات aff_case_memo(tete);//اطبع محتوى الذاكرة } tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة return tete; }}chaine_ref *chaine_ref_organizer(chaine_ref *tete,chaine_ref *tete2)//هذه الدالة تقوم بتنظيم السلسلة المرجعية و تحذف القيم المتكررة بشكل متتال مثل 11 او 222 و هكذا{ chaine_ref *P,*Q,*n_m; int i=0; P=tete2; tete=NULL; Q=tete; while(P!=NULL) { if(P==tete2) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; tete=Q; P=P->ptrn; } else { if(P->a!=Q->a) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; n_m->ptrn=Q; P=P->ptrn; } else P=P->ptrn; } n_m=Q; } return tete;}case_memoire *FIFO(chaine_ref *tete,case_memoire *tete2,int n_c,int *t,int l)//هذه هي الدالة الخاصة بهذه الاستراتيجية{ chaine_ref *p; case_memoire *q,*old; int i=n_c,j=l-n_c; p=tete; q=tete2; //هنا اقوم بملئ الذاكرة بالقيم المرجعية كاول خطوة ثم اتابع تحميل البقية while(q!=NULL && p!=NULL && i>0) { q->a=p->a; q->age=i; p=p->ptrn; q=q->ptrn; i=i-1; } aff_case_memo(tete2); //هنا اقوم بحذف القيم التي تم ادراجها في الذاكرة عن طريق ازاحة قيم الجدول بعدد خانات الذاكرة for(i=0;i<l;i++) t=t[i+n_c]; //هنا تأتي المراحل الاخرى و هي تحميل بقية السلسلة المرجعية في الذاكرة while(j>0)// متغير الحلقة اخذ قيمة ابتدائية هي الفرق بين طول السلسلة المرجعية و عدد خانات الذاكرة لانه يبدأ عمله بع ادراج الدفع الاولى { tete2=ptr_max(tete2,t);// انادي الدالة التي تبحث عن اكبر مكوث و تدرج القيمة التالية حيث توابعها هي خانات الذاكرة و جدول السلسلة المرجعية الجديد for(i=0;i<l;i++)//احذف القيمة التي تم ادراجها t=t[i+1]; j--; } return tete2;}int chaine_ref_lenth(chaine_ref *tete)//الدالة التي تحسب لي طول السلسة المرجعية بعد تنظيمها{ chaine_ref *p; int x; p=tete; while(p!=NULL) { x++; p=p->ptrn; } return x;}//البرنامج الرئيسيmain(){ int n_page,Tpage,nbr_case,Tpgm,i=0,lenth_chaine,Tmc,*t;/*النتغيرات على الترتيب عدد صفحات البرنامج حجم الصفحة الواحدة عدد خانات الذاكرة الخاصة بالبرنامج حجم البرنامج متغير لتحريك الحلقة طول السلسلة المرجعية حجم الذاكرة جدول يحمل السلسلة المرجعية المنظمة و تتم عليه عمليات الحذف*/ chaine_ref *tete_chaine,*chaine_referense,*tete_chaine_or,*p;/*قائمة للمراجع قبل و بعد تنظيمها*/ case_memoire *tete_case_memory,*case_memory;/*قائمة الذاكرة*/ do { printf("entrer la taille de pgm svp : "); scanf("%d",&Tpgm); }while(Tpgm<=0); do { printf("entrer la taille de votre MC svp : "); scanf("%d",&Tmc); }while(Tmc<=0); do { printf("entrer la taille de votre page svp : "); scanf("%d",&Tpage); }while(Tpage<=0); n_page=Tpgm/Tpage;//حساب عدد صفحات البرنامج nbr_case=Tmc/Tpage;//حساب عدد الخانات المخصصة للبرنامج في الذاكرة chaine_referense=criation_chaine(tete_chaine); case_memory=criation_case(tete_case_memory,nbr_case); chaine_referense=chaine_ref_organizer(tete_chaine_or,chaine_referense); lenth_chaine=chaine_ref_lenth(chaine_referense); aff_chain_ref(chaine_referense); aff_case_memo(case_memory); // ايجاد الجدول الخاص بالسلسلة المحرفية تبعا للقائمة المنظمة p=chaine_referense; while(p!=NULL) { t=(int*)malloc(sizeof(int)); t=p->a; p=p->ptrn; i++; } case_memory=FIFO(chaine_referense,case_memory,nbr_case,t,lenth_chaine);}و هذه صور للتنفيذ مرتين
الاولى ناجحة

و هذه هي الثانية و الخطا في المرحلة الثالثة من المفترض ان لا يدر 6 لانها موجودة لكنه ادرجها

بارك فيكم ربي
بالتوفيق