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

هل هناك حدود؟!

بدأه مصطفى 36a2 في 13 مارس 2012 · 7 رد · 749 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

هل هناك في برنامج C++ حدود لكل مما يلي ::

أولاً وأهم الحدود :: عدد العناوين المحجوزة في الذاكرة .. المتحولات والمصفوفات خصوصاً ... وإليكم المشكلة التي ستظهر لكم إن حاولتم تنفيذ هذا البرنامج ::

void main()
{
int VERY_BIG_ARRAY[100000000]={0};
}

ثانياً: استخدام المعالج :: حيث لا يمكن استخدام أكثر من 25% من قدرة المعالج ..

ثالثاً : السماح بالتعامل مع الملفات دون إزعاج :: وأعني عمليات الفتح والقراءة والكتابة .. حيث يحدث أحياناً ..

دخول النظام إلى الملف أثناء محاولة الدخول من البرنامج .. وهذا يؤدي لتشويه عمله بشكل إجرامي .

والخلاصة ::

ما هي أفضل طريقة لعنونة أكثر من مليون عنصر في الذاكرة

وما هي أفضل طرق فتح الملفات والكتابة فيها ..

جزاكم الله خيراً

والسلام عليكم

#2

عذرا ياخى حضرتك تسأل اسئلة ومعك حق فيها

لكن هل صممت برامج تستخدم 30 م.ب من الذاكرة حتى تفكر فى استخدام ذاكرة بــ 1 ج.ب.

هلا لو درست هياكل البيانات وتراكيبها الرياضية؟

هلا لو القيت نظرة عن فكرة قدرة برنامج ما قراء ملف فديو بحجم 1.5 ج.ب؟

هلا لو تعرفت على ذاكرة القرص الصلب المؤقتة.

هل تعلم ان الذاكرة أغلى شئ فى الحاسب . فعند حجزها مرة واحدة ماذا يحدث لة؟

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

تقبل مرورى والله ولى التوفيق

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

الله يجزيك الخير أخي محمد ..

في الحقيقة نعم .. لقد واجهت مشكلة في ذلك في أحد البرامج .. حيث اضطررت لحجز مصفوفة من 13 مليون عنصر من نوع char ...

أعلم أنه لا يمكن تجاوز المألوف بسهولة ولكن هل هناك ( واسطة ) يمكن من خلالها إجبار الجهاز على الخضوع للبرنامج ,,

فالمصفوفة ذات ال13 مليون عنصر تأخذ 13 مليون بايت أي حوالي 13 غيغا من الذاكرة .. ولكن السؤال هنا .. إذا كانت هذه الذاكرة المحجوزة للمتحولات هي الرام ..

فالمشكلة محلولة باستخدام رامات أكبر

والحل الثاني هو استخدام ملفات خارجية لحفظ البيانات ريثما تتم معالجتها .. وهنا أريد معرفة أفضل طرق الكتابة والقراءة من الملفات غير كائنات fstream

جزاك الله خيراً أخي على مرورك ..

#4

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

  1. حسب معلوماتي .. فإن المصفوفة تأخذ عناوين متسلسلة .. لذلك .. لا يمكن لإنشاء مصفوفة بحجم كبير ...
  2. ما رأيكم بهذا الكود :
    #include <stdio.h>
    
    
    struct Node
    {
    int value;
    struct Node * next;
    };
    
    
    struct Node * header;
    struct Node * tmp;
    int main()
    {
    
    	header = new struct Node();
    	tmp = header;
    	//100000000
    	for (double i = 0 ; i < 100000000; i ++)
    	{
    	tmp->value = i;
    	tmp->next =  new struct Node();
    	tmp = tmp->next;
    	}
    
    	tmp = header;
    	while (tmp != NULL)
    	{
    	printf("%d \n" , tmp->value);
    	tmp = tmp->next;
    	}
    
    	return 0;
    
    }

    الذي تمت ترجمته .. لكن سبب hang للجهاز !!!!!!..

  3. رابط

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 14 مارس 2012 في 12:49

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

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5
houssam11350_11350 كتب:

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

  1. حسب معلوماتي .. فإن المصفوفة تأخذ عناوين متسلسلة .. لذلك .. لا يمكن لإنشاء مصفوفة بحجم كبير ...
  2. ما رأيكم بهذا الكود :
    #include <stdio.h>
    
    
    struct Node
    {
    int value;
    struct Node * next;
    };
    
    
    struct Node * header;
    struct Node * tmp;
    int main()
    {
    
    	header = new struct Node();
    	tmp = header;
    	//100000000
    	for (double i = 0 ; i < 100000000; i ++)
    	{
    	tmp->value = i;
    	tmp->next =  new struct Node();
    	tmp = tmp->next;
    	}
    
    	tmp = header;
    	while (tmp != NULL)
    	{
    	printf("%d \n" , tmp->value);
    	tmp = tmp->next;
    	}
    
    	return 0;
    
    }

    الذي تمت ترجمته .. لكن سبب hang للجهاز !!!!!!..

  3. رابط

ستتم ترجمتة بدون مشاكل وستظهر المشكلة وقت التشغيل

لكنك لم تتحقق من أن new حجزت ذاكرة بطريقة صحيحة أم ﻻ

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

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#6

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

اقتباس
ستتم ترجمتة بدون مشاكل وستظهر المشكلة وقت التشغيل

لكنك لم تتحقق من أن new حجزت ذاكرة بطريقة صحيحة أم ﻻ

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

أوافقك الرأي تماما ..

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

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

في الواقع .. هذه المشكلة عندي منذ حوالي شهر وقد تجاوزتها بالطريقة التي سترونها بعد قليل ..

ولكن الحل كان فيه بعض السلبيات فهو يؤدي إلى بطء المعالجة بشكل كبير .. و يسبب أحياناً ( وبدون سبب ) مشاكل مع الويندوز ..

المهم ... إليكم الحل ..

//بسم الله الرحمن الرحيم 
include<fstream.h>
include<iostream.h>
void main()
{
//لنفترض أن الحجم الأعظمي لمصفوفة هو 10 
char arrary[10]={0};
ofstream saveout("save.txt");
saveout<<"There Is No God But Allah\nMohammad\n is  His Massenger";
save.close();
while(!takefrom.eof())
{
ifstream takefrom("save.txt");
for(int i=0;i<10&&!takefrom.eof();i++)
array=takefrom.get();
for(int i=0;i<10;i++)
cout<<array;
}
//قمنا بحفظ واستخدام البيانات شيئاً فشيئاً بما يتناسب مع إمكانيات الجهاز
takefrom.close();
}

أرجو أن تكون المشاركة مفيدة .. والسلام عليكم

#8
اقتباس
أولاً وأهم الحدود :: عدد العناوين المحجوزة في الذاكرة .. المتحولات والمصفوفات خصوصاً

انت محدود بأمرين اولهم ان عدد عناصر المصفوفه يمكن تمثيله بالنوع size_t و ايضا ان النظان الذى تعمل عليه يسمح لك بحجز مثل هذه المساحه من الـ stack لإنه إذا لم يسمح لك سيحدث overflow.

اقتباس
ثانياً: استخدام المعالج :: حيث لا يمكن استخدام أكثر من 25% من قدرة المعالج ..

نظام التشغيل هو من يحدد جهد استهلاك المعالج للبرامج التى تعمل، اغلب انظمة التشغيل تحتوي على priorities تحدد اولوية المعالجة للبرامج.

اقتباس
ثالثاً : السماح بالتعامل مع الملفات دون إزعاج :: وأعني عمليات الفتح والقراءة والكتابة .. حيث يحدث أحياناً دخول النظام إلى الملف أثناء محاولة الدخول من البرنامج .. وهذا يؤدي لتشويه عمله بشكل إجرامي .

هذه اول مره اسمع عن هذا الأمر، عموما إذا كان الملف ملكك و اردت ان تستخدمه انت فقط يمكنك طلب فتحه exclusive لك وحدك و حينها لن يستطيع احد فتحه حتى تقوم انت بغلقه. تحتوى مكتبة iostream على العديد من الفئات التى تتيح لك التعامل مع مختلف انواع الملفات.

اغلب الأمور التى تتحدث عنها لا علاقة لها باللغه و انما هي ترتبط بنظام التشغيل الذى سيعمل عليه برنامجك، لذا ارجع لوثائق نظام التشغيل و ستعرف حدود عمل برنامجك عليه.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

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