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

أفضل طريقة لعمل Dynamic Array

مغلق
بدأه الحسين في 12 يناير 2003 · 18 رد · 2,676 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما هي أفضل طريقة لعمل Dynamic Array ؟؟

بشرط التوفير علي الذاكرة

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#2

ما اعرفة أن المصفوفات في ال C# اصلا ديناميكية ولست بحاجة لأنشاء واحدة

#3

يا أخي العزيز

ردك هذا يعني أنك لا تعرف الإجابة فلما التسرع بالحكم علي الأشياء

يمكنك قراءة هذا المقال كي تزداد علم

http://www.codeproject.com/useritems/arrays.asp

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#4

يمكنك أيضا قراءة هذا المقال

http://www.codeproject.com/csharp/rhgarrayobject.asp

وكان سؤالي ايهما أفضل

أستخدام ArrayList أم عمل ReAllocation لل Array

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#5

أشكرك يا أخي على الرابط ..

أراك عنفت أخاك بعض الشيء مع أنه ماقال الا حقاً ! ، تعتبر المصفوفات في السي شارب ديناميكية (أي يمكنك حجزها أثناء وقت التنفيذ) لكن لا يمكنك تعديل جحمها بعد حجزها .

الشيء الأخر ArrayList تستقبل نوع Object وغالبا عندما نريد التعامل مع الـ ArrayList فإننا نقوم بالتحويل من نوع إلى آخر (Casting) وهذا التحويل يأخذ وقت وأيضا حجم من الذاكرة.

وعندما تقوم بتوسيع المصفوفة كما في الرابط الذي وضعته تنشأ مصفوفة اخرى ويتم نسخ العناصر إليها (طبعا هنا تكون بشكل أسرع مما لو كانت بشكل يدوي)

وأنا أميل الى انك لما تريد التعامل مع مصفوفة معينة فالافضل انك تحجزها بالقدر الي تتوقع انك ماراح تتجاوزه -وبدون اللجوء إلى توسيع المصفوفة- لأن هذا راح يوفر لك الأداء الأفضل بلا شك !

هناك طرق لنسخ عناصر الذاكرة منها مايستخدم في السي مثل memcpy هذه الدالة سريعة أسرع من الطرق العادية في السي شارب . وتوفر منصة ويندوز دالة API تقوم بنفس الوظيفة وبنفس الكفائه ، يمكنك استدعاء دوال API باستخدام ما يسمى Platform Invoke باستخدام DllImport Attribute !

تحياتي :)

#6

شكرا لك أخي الكريم علي هذا الرد

و أستخلص من قولك

1- أن أستخدام Array أفضل من ArrayList.

2- ان الطريقة المتبعة بالرابط السابق ما هي إلا عملية نسخ لعناصر ال Array في أخري ذات الحجم الجديد (وهذا تهدير في الذاكرة) .

أذا دعني أعيد طرحي السؤال بأسلوب أخر وهو :

1- هل يمكن عمل ReAllocation لل Array ؟ (نعم أو لا) ؟.

2- وان كانت الإجابة نعم , فكيف (بدون نسخ محتويات ال Array) ؟ .

وأسف علي ردي السابق لأخي في الله "عمر أبو قعدان" والله لم أقصد تعنيفة

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#8

في سي شارب تستطيع أن تغير حجم الـArrays أثناء سير البرنامج:

// Array initialization
char[] dynChars = new char[32];
...
...
..
// Array re-initialization at run time.
dynChars = new char[45];

في VB.NET يمكن الإحتفاظ بالقيم السابقة باستخدام Preserve...

ولكن في سي شارب، عندما تغير حجم الـArrays، فإن كل البيانات في الـArrays السابقة تفقد...

ولذلك لا بد أن تستعمل Temporary Array تنقل البيانات إليه..ثم منه قبل وبعد تعديل الحجم..

بالنسبة لنقل البانات بين الـArrays هناك طرق عديدة جدا..

مثلا هناك Class تسمى Array...في الحقيقة لم أستخدمها من قبل..

ولكنها تحتوي على دالة تقوم بنقل محتويات الـArrays المختلفة.

MSDN

     int[] myIntArray = new int[5] { 1, 2, 3, 4, 5 };
      Object[] myObjArray = new Object[5] { 26, 27, 28, 29, 30 };

 // Copies the first two elements from the integer array to the Object array.
      Array.Copy( myIntArray, myObjArray, 2 );

وهناك أيضا overload آخر للدالة Array.Copy يتيح النقل بطريفة ديناميكية للغاية:

//Copies a range of elements from an Array starting at the specified source index 
//and pastes them to another Array starting at the specified destination index.

 public static void Copy(Array, int, Array, int, int);

Array Class:

http://msdn.microsoft.com/library/default....yClassTopic.asp

Array.Copy Method:

http://msdn.microsoft.com/library/default....sscopytopic.asp

#9

شكرا لك أخي BAZRAMIT .. الطريقة التي ذكرتها هي نفسها الطريقة التي في الرابط الذي وضعه أخي الحسين .

أما بالنسبة لسؤالك أخي الحسين .. فالمصفوفات في السي شارب لا يمكن عمل Reallocation لها كما قال أخي BAZRAMIT .

لكن كما قلت حاول ان تحجز القدر الذي يكفيك بدون اللجوء إلى توسيع المصفوفة .

تحياتي :)

#10

شكرا علي الرد

وأتسائل بما أن ال vb.Net توفر ال Preserve (وهي لغتي المفضلة سابقا)

وكنت قد نويت منذ 3 أسابيع أو أقل الأنتقال لل #c رغبتن مني في قوة ال #c

ولكن ترتطم رأسي بالحائط بأن أجد أن ال vb.Net يدعم شيء لا تدعمه #c (بأسلوب مباشر أو أسهل)

كيف هذا !!!!!!!!

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#11

استخدام الفئة Array سوف يعطيك نفس الامكانيات والأداء الموجود في Visual Basic .NET ..

#12

الحسين،

Preserve موجودة في VB.NET لأنها مبنية على إمكانيات VB الأساسية..

لا يمكن القول بأن VB.NET افضل من C# بسبب هذا الأمر...

في اعتقادي أن C# اقوى (لغويا) من VB.NET نتيجة لاعتمادها على صيغ سي.

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

ولكن العكس لا يبدو صحيحا دائما...

وأيضا..سي شارب تتيح لك استخدام ما يسمى Unsafe Code...في حين

VB.NET لا تتيح نفس الامكانية..

.....هناك مزايا عديدة لسي شارب...فإذا كان هناك ابن بار لدوت نيت، فهو بالتأكيد سي شارب،

#13

بعد عناء وجدت بصيص من الأمل (وهو حل قابل للتطوير)

وإليكم الكود التالي لفئة صممتها

using System;

using System.Runtime.InteropServices;





namespace MemoryAlloc

{

	public unsafe class Memory

	{

  const int HEAP_ZERO_MEMORY = 0x00000008;

  static int ph = GetProcessHeap();	// Handle for the process heap



	[DllImport("kernel32")]

  static extern int   GetProcessHeap();

	[DllImport("kernel32")]

  static extern void* HeapAlloc(int hHeap, int flags, int size);

	[DllImport("kernel32")]

  static extern bool  HeapFree(int hHeap, int flags, void* block);

	[DllImport("kernel32")]

  static extern void* HeapReAlloc(int hHeap, int flags,void* block, int size);

	[DllImport("kernel32")]

  static extern int   HeapSize(int hHeap, int flags, void* block);



  ////////////////////////////////////////////////////////////////////////

  // Private Constructor to prevent instantiation.

  private Memory() {}



	////////////////////////////////////////////////////////////////////////

  // Allocates a memory block of the given size. The allocated memory is

  // automatically initialized to zero.

  public static void* Alloc(int size) 

  {

 	 void* result = HeapAlloc(ph, HEAP_ZERO_MEMORY, size);

 	 if (result == null) throw new OutOfMemoryException();

 	 return result;

  }



	////////////////////////////////////////////////////////////////////////

  // Free a memory block.

  public static void Free(void* block) 

  {

 	 if (!HeapFree(ph, 0, block)) throw new InvalidOperationException();

  }



  ////////////////////////////////////////////////////////////////////////

  // Re-allocates a memory block. If the reallocation request is for a

  // larger size, the additional region of memory is automatically

  // initialized to zero.

  public static void* ReAlloc(void* block, int size) 

  {

 	 void* result = HeapReAlloc(ph, HEAP_ZERO_MEMORY, block, size);

 	 if (result == null) throw new OutOfMemoryException();

 	 return result;

  }



	////////////////////////////////////////////////////////////////////////

  // Returns the size of a memory block.

  public static int SizeOf(void* block) 

  {

 	 int result = HeapSize(ph, 0, block);

 	 if (result == -1) throw new InvalidOperationException();

 	 return result;

  }



	}

}

وجدتها

ويمكن أستخدامها كما يلي :

using System;



namespace MemoryAlloc

{

	class CTest

	{

  unsafe static void Main(string[] args)

  {

 	 int* arr = (int*)Memory.Alloc(24);



 	 for(int i=0;i<Memory.SizeOf(arr)/sizeof(int);i++) arr =(int)i;

 	 

 	 arr=(int*)Memory.ReAlloc(arr,40);



 	 for(int i=0;i<Memory.SizeOf(arr)/sizeof(int);i++)

    Console.WriteLine("arr[{0}] = {1}",i,arr);



 	 //Memory.Free(arr);

 	 //Console.WriteLine(arr->GetType() );

            Console.Read();

  }

	}

}

--------------------------------------

أبو فهد كتب:

أخي العزيز قمت بالتعديل على الكود لكي يكون واضحا !

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#14

أشكرك أخي على هذا الكود ...

لكن هناك عدة اشكاليات :( ..

أولا:

قمت باستخدام Unsafe Code وهذا لا يحبذ لأنك سلبت السي شارب احد مقوماتها الأساسية أو الـ .Net بالأصح .

ثانيا:

كل الأنواع في الـ .NET تنقسم إلى نوعين:

1- Value Type :

وهذا يتم حجزه في الـ Stack .

2- Reference Type:

وهذا يتم حجزه في الـ Heap .

المصفوفات قد تكون في كلا النوعين:

يعني المصفوفة هي Reference وتشير إلى المخزن بها (ربما يكون Value Type).

ثالثا:

استخدامك للـ HeapReAlloc لا يعفيك من نسخ المصفوفة مرة أخرى .. فقد يحتاج النظام إلى ان ينسخ المصفوفة إلى مكان آخر ! :(

رابعا:

استخدام الفئة Array سوف يكفيك عناء كل ماتقوم به !

#15

شكرا أخي أبوفهد علي أهتمامك

ولكني أريد منك لو سمحت تفسير هذة المقولة :

أولا :-

اقتباس
قمت باستخدام Unsafe Code وهذا لا يحبذ لأنك سلبت السي شارب احد مقوماتها الأساسية أو الـ .Net بالأصح

ما هي هذة المقومات؟

ثانيا :-

اقتباس
استخدامك للـ HeapReAlloc لا يعفيك من نسخ المصفوفة مرة أخرى

هل فعلا تقوم ال HeapReAlloc API Function بعمل نسخ مماثل لما وردا في الردود السابقة ؟

وشكرا

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#16

من أهم المميزات في Microsoft .NET إدارة الذاكرة (Memory Managment) .. إدارة الذاكرة هذه تضمن لبرنامجك العمل لمدة طويلة جدا حتى وإن كان هناك خلل في برنامجك .. تخيل الأتي:

AnyClass anc = new AnyClass();

anc = anotherInstance;

تخيل أنك تقوم باستدعاء دالة تقوم بالكود السابق في برنامجك بشكل مستمر .. ولنفترض أن هذا البرنامج سوف يعمل لمدة اسبوع .. إلى كم تعتقد أن برنامجك سوف يصمد ؟

في السي شارب سوف لن يتأثر البرنامج بفضل استخدام (Garbage Collector) ..

-تعتبر السي شارب Type Safty .. حيث لا يحدث تجاوز الحدود المتغيرات والمصفوفات ولا يمكن تحميل متغير في مكان غير مناسب له !. لكن باستخدام Unsafe فسوف تكون بعيدا عن ذلك .

أمور كثيرة أخرى ... سوف اتحدث عنها عندما يتوفر لدي الوقت ، لكن أنصحك بأن تقرأ عن Microsft .NET وكيفية ادارة الذاكرة (Memory Managment).

بالنسبة للنقطة الثانية .

نعم ، لما تطلب توسيع للمصفوفة باستخدام HeapReAlloc فإن النظام ينظر إن كان هناك مساحة بحيث يمكن التوسيع .. أو يتم الانتقال إلى مكان آخر في الذاكرة ونسخ المحتويات القديمة إلى المكان الجديد .

أخي:

لاحظ ان نسخ عناصر من الذاكرة من مكان إلى أخر ليس كنسخ عناصر من الـ HardDisk من مكان إلى آخر ..

نظام التشغيل بنفسه يستخدم مايسمى بالـ Paging والذي يتم التعامل فيه بين الذاكرة (Ram) والقرص الصلب !

أيضا لاحظ ان استخدام النسخ بشكل يدوي من مصفوفة إلى أخرى في نفس البرنامج ليس كاستخدام نسخ الـ Bytes في الذاكرة ، حيث أن الأخيرة أسرع بكثير وهذا ما توفره لك و HeapReAlloc (لكنها غير محبذة), memcpy, الفئة Array !

#17

شكرا جزيلا علي سعة صدرك معي وبارك الله فيك

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#18

حياك أخوي ....

#19

مشكلة unsafe code ليس فقط أن المبرمج يحتاج إلى إدارة الذاكرة بالكامل

بنفسه ...

ولكن أيضا عندما يتم تشغيل هذا النوع من الكود عبر الشبكات فإنه لا يحصل

على Permission أو سماحية للعمل.

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

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