PDA

View Full Version : سوال: ... Err: Goto bypasses initializ



Ali007
سه شنبه 31 اردیبهشت 1387, 09:10 صبح
با سلام خدمت اساتید :لبخندساده:

من تو نوشتن یه برنامه گرافیکی با c به یه مشکل برخوردم :اشتباه: ، برنامه به این صورت هست که یک منو اصلی داره که شامل 4 قسمته این منو ، که با زدن کلید های 1و2و3و4 برنامه با دستور Goto به بخش های مربوط به هر کلید رفته و پس از اتمام کار با زدن کلید m باز به منو برمیگرده که کد خلاصه شده بهمراه شماره هر سطر رو میبینید :



34 void main(void)
35 {
36 initgraph(&gd,&gm,"c:\\TC\\BGI");
38 menu:
39 cleardevice();
// Codehaye menu
....
// Codehaye menu

58 ch=0;
59 while(ch!=27)
60 {
61 switch(ch)
62 {
63 case('1'):{
// Code
....
// Code
73 goto part1;
74 }
75 case('2'):{
// Code
....
// Code
81 goto part2;
82 }
83 case('3'):{
// Code
....
// Code
89 goto part3;
90 }
91 case('4'):{
// Code
....
// Code
97 goto end;
98 }
99 }
100 ch=getch();
101 }
102 getch();
103 goto menu;
104 part1:
105 cleardevice();
// Code haye part1
....
// Code haye part1
134 ch=getch();
135 if(ch=='m')
136 goto menu;
137 else
138 goto part1;
139 part2:
140 cleardevice();

// Code haye part2
....
// Code haye part2

154 ch=getch();
155 if(ch=='m')
156 goto menu;
157 else
158 goto part2;
159 part3:
160 cleardevice();
// Code haye part3
....
// Code haye part3
346 ch=getch();
347 if(ch=='m')
348 goto menu;
349 else
350 goto part3;
352 end:
353 closegraph();
354 }

البته هنوز برنامه کامل نشده بود که موقع کامپایل با این Error مواجه شدم :

Error : name.cpp 97: Goto bypasses initialization of a local variable

البته فعلا برای Goto خط 97 مربوط به 4 Case این Error مشاهده شده ، که این منو بدون کد های هر Part بخوبی کامپایل و کار میکنه ( ساختار درسته ) اما با گذاشتن کد های هر Part این Error برای دستور Goto مربوط به Case بعدی مشاهده میشه ( امکانش هست بدلیل طولانی بودن کد های هر Part باشه ؟ ) :متفکر:

دوستان اگه راه حلی برای رفع این مشکل یا پیشنهادی که عملا بشه کار Goto رو شبیه سازی کرد واسه این برنامه بدن ، یه دنیا ممنون میشم ( کارم گیرشه ) :ناراحت:

D32.00110
سه شنبه 31 اردیبهشت 1387, 13:28 عصر
سلام

علی جان شما استاد مایی ولی خوب شرمنده جسارت است دیگه ... :بامزه:
چرا کارو پیچیده میکنی اینطوری همون جا که مینویسی Goto کدهای مربوط به Label رو بنویس و یه Break که خارج بشه ...
یه چیزی شبیه این :


do // does a loop while they ESC key is not pressed


{
key = getch(); // keycode stored into key
// if 1 is pressed
if (key==49)


{
function1(); // call function1
break; // stop the loop
}

else
// if 2 is pressed
if (key==50)


{
function2();
break;
}

else
// if 3 is pressed
if (key==51)


{
function3();
break;
}

} while (key != 27); // if ESC is pressed then stop the loop

Ali007
سه شنبه 31 اردیبهشت 1387, 13:39 عصر
سلام علی جان

اختیار دارید ، روش شما کاملا درسته اما من یجورایی توی ساختار محدودم یعنی ساختار از پیش تعیین شدست و باید بهمین شکل باشه ( گیرداده دیگه ... :لبخند: )

واسه همین استفاده از Break هم جواب نمیده ...

اما باز هم از توجه شما ممنونم ، کسی دیگه ای پیشنهادی نداره ؟

Nima_NF
سه شنبه 31 اردیبهشت 1387, 15:25 عصر
اول از هر چیز من هم مثل پست قبلی به شما پیشنهاد می کنم که از توابع به جای goto استفاده کنید، چون استفاده از goto به این شکل غیر معقول هست.

برای مشکل شما ، احتمالا در داخل حوزه case یا lable های پرشی خود متغیری تعریف کرده اید و مقدار دهی اولیه کرده اید، در زبان C باید برای این موارد یا متغیر را خارج از حوزه تعریف کنید یا از بلاک { } استفاده کنید ،
برای عبارت داخل case نیازی نیست از ( ) استفاده کنید،
break هم بعد از هر case قرار دهید.



case '1':
{
// codes
break;
}

part1:
{
// codes
}
موفق باشید