واضح آرشیو وب فارسی:سایت ریسک: مشکل در استفاده از redim در ویژوال بیسیک zhm 11 ارديبهشت 1388, 22:30سلام .بازم پیشاپیش از هر عزیزی که لطف کنه و کمکم کنه ممنونم.تا اینجا هم از آقای the king خیلی خیلی ممنونم. یه ماتریس دارم به اسم newmat.این ماتریس در ابتدای برنامه از نوع variant تعریف شده.یکبار در اوایل برنامه ابعاد ماتریس بصورت زیر مشخص شده: (redim preserve newmat(1 to i,1 to j که i وj اعداد مشخصی اند.برای بار دوم که در طول برنامه از redim preserve newmat استفاده کردم برنامه موقع اجرا خطا میده!(subscript out of range) مشکل چی میتونه باشه؟ saalek110 11 ارديبهشت 1388, 22:42visual basic+"subscript out of range"+redim را سرچ کنید. اولین سایت اینه: سایت بالا و بقیه سایتها را ببینید. شاید مشکل شما هم همین باشد. معمولا وقتی خطایی دریافت می کنید با سرچ خطا می توانید خیلی اوقات سریع به جواب برسید. چون حتما فرد دیگر هم با این خطا قبلا روبرو شده. the_king 11 ارديبهشت 1388, 23:36سلام .بازم پیشاپیش از هر عزیزی که لطف کنه و کمکم کنه ممنونم.تا اینجا هم از آقای the king خیلی خیلی ممنونم. یه ماتریس دارم به اسم newmat.این ماتریس در ابتدای برنامه از نوع variant تعریف شده.یکبار در اوایل برنامه ابعاد ماتریس بصورت زیر مشخص شده: (redim preserve newmat(1 to i,1 to j که i وj اعداد مشخصی اند.برای بار دوم که در طول برنامه از redim preserve newmat استفاده کردم برنامه موقع اجرا خطا میده!(subscript out of range) مشکل چی میتونه باشه؟ طبیعتا زمانی که قصد حفظ محتویات قبلی آرایه را دارید از Preserve استفاده می کنید، اما Preserve محدودیت های خاص خودش را دارد. Preserve صرفا برای تعویض اندیس بالایی آخرین مولفه آرایه کاربرد داره. مثلا اگر مولفه اول آرایه دو بعدی 1 الی 4 باشه و مولفه دوم 2 الی 10 باشه، شما صرفا می توانید مقدار 10 را به عدد دیگری تغییر دهید. تلاش برای تغییر مولفه پایینی مولفه دوم (عدد 2) و یا تغییر در مولفه اول (1 الی 4) باعث بروز خطا خواهد شد. شما بایستی ابتدا آرایه را در یک آرایه دیگر کپی بگیرید، آرایه را بدون استفاده از Preserve تغییر ابعاد دهید و مجددا مقادیر را از آرایه کپی شده در آرایه اصلی بازنویسی کنید. تابع زیر این عمل را انجام می دهد، از آن بجای Redim Preserve استفاده کنید، پارامتر اول، نام آرایه و پارامتر های دوم و سوم اندیس های پایینی و بالایی مولفه اول و پارامتر های چهارم و پنجم، اندیس های پایینی و بالایی مولفه دوم هستند ، این تابع صرفا با آرایه های دو بعدی کار می کند و پیش از اجرای تابع، بایستی آرایه غیر تهی باشد : Private Function RedimPreserveArray(ByRef VarArray As Variant, ByVal X1 As Long, ByVal X2 As Long, ByVal Y1 As Long, ByVal Y2 As Long) As Variant Dim TempArray As Variant Dim X As Long, Y As Long ReDim TempArray(X1 To X2, Y1 To Y2) X1 = IIf(X1 >= LBound(VarArray, 1), X1, LBound(VarArray, 1)) X2 = IIf(X2 <= UBound(VarArray, 1), X2, UBound(VarArray, 1)) Y1 = IIf(Y1 >= LBound(VarArray, 2), Y1, LBound(VarArray, 2)) Y2 = IIf(Y2 <= UBound(VarArray, 2), Y2, UBound(VarArray, 2)) For X = X1 To X2 For Y = Y1 To Y2 TempArray(X, Y) = VarArray(X, Y) Next Next RedimPreserveArray = TempArray End Function تابع فوق آرایه تغییر اندازه داده شده را به عنوان مقدار خروجی برمی گرداند. مثلا کد زیر ابعاد آرایه A را از 5x10 به 6x20 تغییر می دهد : Dim A() As Variant ReDim A(1 To 5, 1 To 10) As Variant A = RedimPreserveArray(A, 1, 6, 1, 20) مثال زیر اندیس پایینی مولفه های آرایه A را از 1 به 3 تغییر می دهد و در B ذخیره می کند : Dim A(1 To 10, 1 To 20) As Variant Dim B() As Variant B = RedimPreserveArray(A, 3, 10, 3, 20) zhm 11 ارديبهشت 1388, 23:57بازم مثله همیشه جوابتون کامل و عالی بود و طبق معمول جز تشکر چیزی نمیتونم بگم.یه دنیا ممنونتونم....از آقای سالک هم بابت جوابشون ممنونم:) بخاطر جوابای کاملتونه که به هر مشکلی میخورم اولین راه حلی که به ذهنم میرسه کمک گرفتن از شماست.بازم ممنون:)
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 2960]