PDA

View Full Version : محدودیت در نوشتن دستور if



سید حمید حق پرست
یک شنبه 14 اسفند 1390, 00:59 صبح
سلام دوستان و اساتید بزرگوار
یه مشکل برام پیش اومده :
داخل :
Private Sub Combo4_Click()
End Sub

من 63 تا if نوشتم حالا که 64 رو بنویسم هنگام اجرای برنامه وقتی روی Combo4 کلیک میکنم خطای زیر رو میده:گیج: :
83658
83659

میخواستم بپرسم این مشکل چگونه برطرف میشه


ممنونم جوابمو بدید


یا علی (ع)

ASedJavad
یک شنبه 14 اسفند 1390, 05:37 صبح
سلام
من که تست کردم تا 70 تا هم ارور نداد!

returnx
یک شنبه 14 اسفند 1390, 10:49 صبح
حالا شما چی نوشتید که اینطوری شد نمیدونم ، اصلا درست نیست 63 if بنویسید و بعد بیاید 63 End if هم آخرش بزارید بهتر از ساختار Else if استفاده کنید که حده اقل مجبور نشین 63 تا End if هم بزارید...
در ضمن در چینین حالاتی که تعداد شروط زیاد میشه توصیه میشه از Select Case استفاده بشه...

setroyd
یک شنبه 14 اسفند 1390, 10:51 صبح
شاید مشکل از شرطها باشه چون برای if محدودیتی وجود نداره ..

سید حمید حق پرست
یک شنبه 14 اسفند 1390, 11:29 صبح
با تشکر از جواب دوستان . من یک نمونه مینویسم :

Dim Stri As String
Dim i
Dim k

If Combo4.Text = "62-maysam" Then
Open App.Path & "\teach.txt" For Input As #1
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
If i = 620 Then k = Stri
If i = 621 Then k = k + T + Stri
If i = 622 Then k = k + T + Stri
If i = 623 Then k = k + T + Stri
If i = 624 Then k = k + T + Stri
If i = 625 Then k = k + T + Stri
If i = 626 Then k = k + T + Stri
If i = 627 Then k = k + T + Stri
If i = 628 Then k = k + T + Stri
Loop
Close #1
Text1.Text = k
i = 0
Else
If Combo4.Text = "63-hamid" Then
Open App.Path & "\teach.txt" For Input As #1
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
If i = 630 Then k = Stri
If i = 631 Then k = k + T + Stri
If i = 632 Then k = k + T + Stri
If i = 634 Then k = k + T + Stri
If i = 635 Then k = k + T + Stri
If i = 636 Then k = k + T + Stri
If i = 637 Then k = k + T + Stri
If i = 638 Then k = k + T + Stri
If i = 639 Then k = k + T + Stri
Loop
Close #1
Text1.Text = k
i = 0
Else
If Combo4.Text = "64-ali" Then
Open App.Path & "\teach.txt" For Input As #1
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
If i = 641 Then k = Stri
If i = 642 Then k = k + T + Stri
If i = 643 Then k = k + T + Stri
If i = 645 Then k = k + T + Stri
If i = 646 Then k = k + T + Stri
If i = 647 Then k = k + T + Stri
If i = 648 Then k = k + T + Stri
If i = 649 Then k = k + T + Stri
If i = 650 Then k = k + T + Stri
Loop
Close #1
Text1.Text = k
i = 0
Else
Text1.Text = "chizi mojod nist"
End If
End If
End If

مه if ها اینجوری نوشته شده که در هر کدومش میاد چند خط بخصوصی از فایل میکخونه

shahabbasic
یک شنبه 14 اسفند 1390, 12:57 عصر
در نوشتن if ها محدودیتی وجود نداره اما تعداد خط های یک پروسیجر محدودیت داره و پیغام خطای Procedure too large ناشی از همین مورده
توصیه میکنم چندین روال ایجاد کنید تا دستورات مربوط به یک روال رو کاهش بدید بدین صورت که در پایان هر روال , روال بعدی رو صدا بزنید.

quiet_programmer
یک شنبه 14 اسفند 1390, 15:20 عصر
باسلام.


در نوشتن if ها محدودیتی وجود نداره اما تعداد خط های یک پروسیجر محدودیت داره و پیغام خطای Procedure too large ناشی از همین موردهچه جالب منم نمیدونستم vb6 همچین محدودیتی داره. سرچ کرد دیدم بله. ولی در تکمیل فرمایش جناب shahabbasic (http://barnamenevis.org/member.php?214889-shahabbasic) باید گفت. تعداد خط نه اندازه قطعه کد هر پروسیجر 64k میتونه باشه.
I get a "Procedure too large" compile error A: Taken from Visual Basic documentation:
"Each procedure can contain up to 64K of code. If a procedure or module exceeds this limit, Visual Basic generates a compile-time error. If you encounter this error, you can avoid it by breaking extremely large procedures into several smaller procedures, or by moving module -level declarations into another module."


یاحق.
موفق باشید/

shahabbasic
یک شنبه 14 اسفند 1390, 16:51 عصر
اندازه قطعه کد هر پروسیجر 64k میتونه باشهدر موقع ساخت برنامه بله این محدودیت وجود داره اما نه تنها برنامه با بیشتر از 64k برای هر پروسیجر کامپایل میشه بلکه بعد از ساخت exe , پردازنده مجبور میشه تمام دستورات پروسیجر رو اجرا کنه چه بیشتر از 64k چه کمتر
در نتیجه خطای Procedure too large فقط برای زمان طراحیه

سید حمید حق پرست
یک شنبه 14 اسفند 1390, 23:25 عصر
ممنونم از دوستان
راه حلی ندارید واسه این مشکل؟


یا علی (ع)

just4froum
یک شنبه 14 اسفند 1390, 23:32 عصر
چرا این قسمتو بدین شکل نمینویسی

کد خودت


If i = 642 Then k = k + T + Stri
If i = 643 Then k = k + T + Stri
If i = 645 Then k = k + T + Stri
If i = 646 Then k = k + T + Stri
If i = 647 Then k = k + T + Stri
If i = 648 Then k = k + T + Stri
If i = 649 Then k = k + T + Stri
If i = 650 Then k = k + T + Stri


اینم یه کد دیگه : ( فکر کنم یک جور جواب بدن )

Dim x As Long

For x = 642 To 650
If i = x Then
k = k + T + Stri
Else
Exit For
End If
Next i

سید حمید حق پرست
یک شنبه 14 اسفند 1390, 23:53 عصر
فکر کنم با اینم مشکل پیدا کنم چون الان 64 تا شده ارور داده ولی من حدود 1000 تا باید بنویسم

ممنون میشم کمکم کنید . این برنامه خیلی برام مهمه


یا علی (ع)

shahabbasic
دوشنبه 15 اسفند 1390, 12:24 عصر
گفتم که دستورات رو بین چندین روال تقسیم کن و آخر هر روال , روال بعدی رو صدا بزن درست میشه

quiet_programmer
سه شنبه 16 اسفند 1390, 10:40 صبح
باسلام.


فکر کنم با اینم مشکل پیدا کنم چون الان 64 تا شده ارور داده ولی من حدود 1000 تا باید بنویسم

ممنون میشم کمکم کنید . این برنامه خیلی برام مهمه برنامه ای که خودت نوشتی رو میشه خیلس ساده تر از اینا نوشت. ایراد میگیرم به کد نویسیت که از دستورات تکراری زیاد استفاده میکنی. مثلا دستور باز کردن فایل رو تو هر if آوردی. میتونی فایل رو در ابتدا باز کنی و دیگه این دستور رو تو هر بخش استفاده نکنی. از طرف دیگه توصیه میشه برای شرطهای تو در تو اگه منطق برنامه اجازه بده به جای If های تودرتو از If Else استفاده بشه. اینکار نتنها باعث میشه خوانایی کد بالا بره بلکه باعث میشه برنامه سریعتر اجرا بشه(دلیل این امر کاملا واضحه). مثلا دستور شرط کومبو4 خاصیت تکست برابر فلان باشد رو در نظر بگیر. خوب معلومه اگه این خاصیت برابر مثلا 62-maysam شد دیگه نمیتونه برابر 63-hamid در همون لحظه اجرای پروسیچر باشه بس بهتره از If ElseIf استفاده بشه. یه جای کار هم باز جای برسی داره. د ستورات شرطی که استفاده کردی کدش یکسانه فقط برای i های با مقدار مشخص میخوای اون دستور اجرا بشه خوب میتونی از Select Case استفاده کنی. من کد رو اصلاح کردم میزارم برات ولی باز هم میشه از این بهینه تر کرد. مثلا میشه این کد رو تو 20 الی 25 خط دوباره نوشت. یه راهنمایی کنم برای اینکه خودت زحمت اینکارو بکشی. دستورات داخل if ای که برای برسی مقدار تکست از کومبو باکس نوشتی همش یکیه فقط تو مقدار iها برای اجرای دستورات شرطی فرق دارن. اگه دقت کنی فقط با دستورات قبلی برای i، با دستور بعدی مقدار i فقط 10 تا اختلاف هست. نمیدونم منظورمو تونستم برسونم یا نه. ولی اگه نگرفتی چی شد بگو انجام بدم. چون انجام دادنش راحتتر از توضیح دادنشه.

Dim Stri As String
Dim i
Dim k

Open App.Path & "\teach.txt" For Input As #1
i=0
If Combo4.Text = "62-maysam" Then
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
Select Case i
Case 620
k = Stri
Case 621 to 628
k = k + T + Stri
End Select
Loop
Text1.Text = k
ElseIf Combo4.Text = "63-hamid" Then
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
Select Case i
Case 630
k = Stri
Case 631 to 639
k = k + T + Stri
End Select
Loop
Text1.Text = k
ElseIf Combo4.Text = "64-ali" Then
Do While Not EOF(1)
i = i + 1
Line Input #1, Stri
Select Case i
Case 641
k = Stri
Case 642 To 650
k = k + T + Stri
End Select
Loop
Text1.Text = k
Else
Text1.Text = "chizi mojod nist"
End If
Close #1

حتی میتونی این قطعه از کد رو به این شکا بنویسی

Select Case i
Case 641
k = Stri
Case 642 To 650
k = k + T + Stri
End Select

معادل:
If i=641 Then
k = Stri
ElseIf i>=642 And i<=650 Then
k = k + T + Stri
End If


چرا این قسمتو بدین شکل نمینویسی

کد خودت


If i = 642 Then k = k + T + Stri
If i = 643 Then k = k + T + Stri
If i = 645 Then k = k + T + Stri
If i = 646 Then k = k + T + Stri
If i = 647 Then k = k + T + Stri
If i = 648 Then k = k + T + Stri
If i = 649 Then k = k + T + Stri
If i = 650 Then k = k + T + Stri


اینم یه کد دیگه : ( فکر کنم یک جور جواب بدن )

Dim x As Long

For x = 642 To 650
If i = x Then
k = k + T + Stri
Else
Exit For
End If
Next i
اگه Exit For بیاد داخل شرط i=x یا حداقل اگه Exit For رو پاکش کنیم تازه میشه این کد رو برسی کرد. بعد اون میشه به این نتیجه رسید که گفت آقای/خانم just4froum (http://barnamenevis.org/member.php?211054-just4froum) از شما بعیده.

یاحق.
موفق باشید/

quiet_programmer
سه شنبه 16 اسفند 1390, 11:17 صبح
با سلام.

این هم یه کد معادل دیگه:

Dim Stri As String
Dim i
Dim k
Dim Lr,Hr as integer
i=0
Select Case Combo4.Text
Case "62-maysam"
Lr=620
Hr=628
Case "63-hamid"
Lr=630
Hr=639
Case "64-ali"
Lr=640
Hr=650
Case Else
Text1.Text = "chizi mojod nist"
Exit Sub
End Select
Open App.Path & "\teach.txt" For Input As #1
While Not EOF(1)
i = i + 1
Line Input #1, Stri
Select Case i
if i=Lr Then
k = Stri
ElseIf i>Lr And i<=Hr Then
k = k + T + Stri
Elseif i>Hr Then
Exit While
End If
Loop
Text1.Text = k
Close #1


ولی باز هم میشه با استفاده از خاصیت ItemData از Combobox کمترش کرد.

یاحق.
موفق باشید/