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

المصفوفات فى الفيجوال بيسك

مغلق
بدأه C++er في 8 يناير 2008 · 6 رد · 4,021 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

فى مشكله معايا فى التعامل مع المصفوفات و الدوال هى كالتالى

احاول ان اصنع دالة تقبل مصفوفة كمعامل و فى نفس الوقت تعود بمصفوفة و هنفترض ان شكلها كالتالى

Public Function vTable (Arr() as byte,ParamArray Args()) as byte()
.
.
.
.
End Function

المشكله انى احيانا لا احتاج لإستخدام المعامل الأول Arr() لذا حاولت استخدام الـ Keyword optional معها لكن المترجم اعترض على اساس انه لا يمكن استخدام هذه الكلمة المحجوزة مع مصفوفة.

و طبعا لا يمكن ان استغنى عن هذا المعامل و لا يمكن اجعله معامل عادى - اى ليس مصفوفة - فما الحل ؟؟

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

تم تعديل هذه المشاركة بواسطة Game Expert في 9 يناير 2008 في 00:21

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

#2

علشان اسهل الموضوع ازاى اقدر اعرف ان المصفوفة اتعمل لها Initialize يعنى قبل ما استخدمها عايز اعرف المصفوفة دى فيها عناصر و لا لأ

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

تم تعديل هذه المشاركة بواسطة Game Expert في 9 يناير 2008 في 00:38

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

#3

الأخ الفاضل ...

أرجو أن يساعدك هذا الكود فى ما تريد إنجازه

Option Explicit

Public Function vTable(ParamArray Args()) As Byte()
	Dim Arr() As Byte
	Dim Result() As Byte
	Dim iUB As Integer
	Dim start As Integer, counter As Integer

	start = 0
	On Local Error GoTo Not_Array
	Arr = Args(0)
	' First element is array

	For counter = 0 To UBound(Arr)
		MsgBox "InitArray(" & counter & ") = " & Arr(counter)
	Next counter

	start = 1
Not_Array:
	On Local Error GoTo 0

	iUB = UBound(Args)
	ReDim Result(iUB - start)

	For counter = start To iUB
		Result(counter - start) = Args(counter)
	Next counter

	vTable = Result
End Function

Public Sub Test()
	Dim Init(3) As Byte
	Dim Ret() As Byte
	Dim counter As Integer

	' Without Array
	MsgBox "------ Without Array ------"
	Ret = vTable(1, 10, 100)	' 111
	For counter = 0 To UBound(Ret)
		MsgBox "Return(" & counter & ") = " & Ret(counter)
	Next counter

	' With Array
	MsgBox "------ With Array ------"
	Init(0) = 9
	Init(1) = 4
	Init(2) = 1
	Init(3) = 3

	Ret = vTable(Init, 2, 20, 200)   ' 222
	For counter = 0 To UBound(Ret)
		MsgBox "Return(" & counter & ") = " & Ret(counter)
	Next counter
End Sub

Private Sub Form_Load()
	Call Test
End Sub

شكراً

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#4

الأخ أسامه اعتقد انك لم تفهم قصدى

لابد ان يوجد معاملين اوهما يأخذ القيمه Byte او Long و لابد ان تكون مصفوفة ، اما المعامل الثانى قلابد ان يكون ParamArray

و هديك مثال معين المصفوفة الأولى هيكون متخزن فيها الـ Function Pointer لحاولى 10 دوال

الـ ParamArray هيدخل فيها 10 Parameters و كل واحد فيهم بمثل مصفوفة معاملات الدوال الموجوده فى مصفوفة المعامل الأول.

المسأله يطول شرحها بس اخيرا عرفت الحاجه اللى انا محتاجها بالظبط وهى ازاى اقدر اعرف ان Array معينه لم يتم عمل Initialize لها

و هديك مثال

اقرأ الكود التالى

Dim c() as byte

msgbox ubound(c) ' Subscript out of range

redim c(0)

msgbox ubound(c) ' 0

redim preserve c(0 to 3)

msgbox ubound(c) ' 3

انا عايز اعرف اذا كانت المصفوفة اتعمل لها initialize و لا لأ

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

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

#5
اقتباس
انا عايز اعرف اذا كانت المصفوفة اتعمل لها initialize و لا لأ

اليك بهذا الرابط

/index.php?showtopic=136238

وممكن ايضا تمرر بدل Byte() من نوع Variant

وتفحص باستخدام Isarray

#6
Game Expert كتب:
الأخ أسامه اعتقد انك لم تفهم قصدى

لابد ان يوجد معاملين اوهما يأخذ القيمه Byte او Long و لابد ان تكون مصفوفة ، اما المعامل الثانى قلابد ان يكون ParamArray

و هديك مثال معين المصفوفة الأولى هيكون متخزن فيها الـ Function Pointer لحاولى 10 دوال

الـ ParamArray هيدخل فيها 10 Parameters و كل واحد فيهم بمثل مصفوفة معاملات الدوال الموجوده فى مصفوفة المعامل الأول.

الأخ الفاضل ...

لم يكن ذلك واضح بالقدر الكافى :)

جرب الفكرة التالية، وهى لا تعتمد على ParamArray، ولكن تعتمد على إنشاء نوع جديد myType، يحتوى المعلومات التى تريد ارسالها

Option Explicit

Private Type myType
	myParam As Long
	myArr() As Long
End Type

Private Function vTable(ByRef Arr() As myType) As Byte()
	Dim Result() As Byte
	Dim iUB As Integer
	Dim counter As Integer
	Dim iUBmembers As Integer
	Dim members As Integer

	iUB = UBound(Arr)
	ReDim Result(iUB)

	For counter = 0 To iUB
		iUBmembers = UBound(Arr(counter).myArr)
		Result(counter) = 0
		For members = 0 To iUBmembers
			Result(counter) = Result(counter) + Arr(counter).myArr(members)
		Next

		Result(counter) = Result(counter) * Arr(counter).myParam
	Next counter

	vTable = Result
End Function

Private Sub Test()
	Dim Init(1) As myType
	Dim Ret() As Byte
	Dim counter As Integer

	Init(0).myParam = 9
	ReDim Init(0).myArr(3)
	Init(0).myArr(0) = 2
	Init(0).myArr(1) = 4
	Init(0).myArr(2) = 5
	Init(0).myArr(3) = 7

	Init(1).myParam = 6
	ReDim Init(1).myArr(2)
	Init(1).myArr(0) = 3
	Init(1).myArr(1) = 8
	Init(1).myArr(2) = 9

	Ret = vTable(Init)
	For counter = 0 To UBound(Ret)
		MsgBox "Return(" & counter & ") = " & Ret(counter)
	Next counter
End Sub

Private Sub Form_Load()
	Call Test
End Sub

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 9 يناير 2008 في 23:53

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#7

الأخ طارق و الأخ أسامه جزاكم الله خيرا و شكرا لكم على الإفادة

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

تم تعديل هذه المشاركة بواسطة Game Expert في 9 يناير 2008 في 18:23

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

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

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