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

ماذا يقصد بالدوالة التالية في #c

مغلق
بدأه فواز الشمري في 6 يناير 2008 · 2 رد · 848 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بعد التحية :

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

لذلك اتمنى من الأخوه شرح مفهوم عمل هذه الدالة كما في الكود التالي :

ايش القصد من هذا السطر

fixed (char *dest = tmp, src = this) {
	memcpy ((byte*)dest, (byte*)(src + startIndex), length * 2);
}

ماهي fixed

ايضا

[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static String InternalAllocateStr (int length);

ماذا يقصد بـ InternalCall في الدالة InternalAllocateStr واين الكود الفعلي لها هل هي دالة api يتم استدعائها ام ماذا

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

public unsafe String Substring (int startIndex, int length)
		{
			if (length < 0)
				throw new ArgumentOutOfRangeException ("length", "< 0");
			if (startIndex < 0)
				throw new ArgumentOutOfRangeException ("startIndex", "< 0");
			// re-ordered to avoid possible integer overflow
			if (startIndex > this.length - length)
				throw new ArgumentOutOfRangeException ("startIndex + length > this.length");

			if (length == 0)
				return String.Empty;

			string tmp = InternalAllocateStr (length);
			fixed (char *dest = tmp, src = this) {
				memcpy ((byte*)dest, (byte*)(src + startIndex), length * 2);
			}

			return tmp;
		}	


[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static String InternalAllocateStr (int length);

هذه هي طريقتهم في البرمجة فماذا عنا كيف نبرمج نحن الصراحة تعقدت لما شفت فكره عمل الدالة substring طبعا هناك اكثر من وسيط parameters للدالة ولكن ارفت المثال فقط لاحد صيغ هذه الدالة substring

ياريد حد يشرح فكره العمل الخاصة بها

#2

استخدم في هذة الدالة المؤشرات والموضحة في جملة fixed وذلك لتسريع عمل الدالة

fixed (char *dest = tmp, src = this) {

memcpy ((byte*)dest, (byte*)(src + startIndex), length * 2);

}

وهذا الكود يقوم بنسخ محتوي this ويضعة في dest مع ازاحة مقدرة بـ startIndex

والمؤشرات في السي شارب قد تكون قريبة جداً في التعامل مثل السي بلس بلس و السي

هذة الطرق مستخدمة كثيراً في برامج معالجة الصور والبيانات, ومن الممكن ان تستخدمها اذا اتيحت لها الفرصة في برامجك.

والمؤشرات متاحة فقط في السي شارب و السي بلس بلس دوت نت علي مااعتقد.

وعند استخدامها في السي شارب يجب عمل التالي.

- الدالة التي تحتوي علي مؤشرات يجب تبدأ عند التصريح عنها بالكلمة المفتاحية unsafe مثل

public unsafe String Substring (int startIndex, int length)
{
	 string tmp = InternalAllocateStr (length);
	 fixed (char *dest = tmp, src = this) {
			memcpy ((byte*)dest, (byte*)(src + startIndex), length * 2);
	 }
	return temp;
}

أو

public String Substring (int startIndex, int length)
{
	unsafe {
		 string tmp = InternalAllocateStr (length);
		 fixed (char *dest = tmp, src = this) {
				memcpy ((byte*)dest, (byte*)(src + startIndex), length * 2);
		 }
	}
	return temp;
}

- يجب ادراج الخيار /unsafe+ الي المترجم اذا كنت تستخدم مسطر الاوامر. او من خلال الفيجوال استوديو

Project -> Properties -> Build -> Allow unsafe code

ويمكن استخدام الطريقة الاتية اذا كنت لاتحتاج الي استخدام المؤشرات أو انك تكتب كلاس بالفيجوال بيسك دوت نت من خلال

System.Buffer.BlockCopy

او

Array.Copy

هذا والله اعلم

تم تعديل هذه المشاركة بواسطة Moudey في 6 يناير 2008 في 23:36

مواضيع متنوعة

#3

fixed تمنع الـ garbage collecion من التعامل مع المتغيرات المعرفة بعدها (داخل القوسين)

وانت تعرف ان الـ garbage collecion يقوم عادة بعمليات آلية لإدارة الذاكرة بمعنى حذف المتغيرات التي لم يعد لها حاجة في البرنامج، وذلك لمنع تبذير الموارد، الآن عند وضع جملة fixed نمنع ال garbage collecion من حذف هذه المتغيرات...

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 7 يناير 2008 في 20:04

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

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