View Full Version : سوال: ترجمه ی خطای کامپایلر!!
*Fatemeh*
سه شنبه 05 اسفند 1393, 12:35 عصر
سلام دوستان من می خوام این cout چاپ بشه
cout<<"Darse ba bishtarin moadel:"<<(j-1);
ومی خوام مقدار j-1چاپ بشه این خیلی ساده است ولی کامپایلر این خطارو میگیره:
36 39 [Error] name lookup of 'j' changed for ISO 'for' scoping [-fpermissive]
36 39 [Note] (if you use '-fpermissive' G++ will accept your code)
این چی میگه؟؟؟؟
rahnema1
سه شنبه 05 اسفند 1393, 12:53 عصر
سلام، شما حلقه را چه جوری نوشتید لطفا کد کامل را بذارید
farshid rezaie
سه شنبه 05 اسفند 1393, 13:16 عصر
سلام شما برای این کد یا حلقه ای برای خروجی نگذاشتید یا حلقه ای با دستور اشتباه استفاده کردین :لبخندساده:
*Fatemeh*
سه شنبه 05 اسفند 1393, 13:27 عصر
{
int m,n,s=0,max=0,min=0;
cout<<"Lotfan tedad daneshjooyan va doroos ra vared konid:";
cin>>m>>n;
float a[n],b[m];//ãÇÊÑíÓ åÇ ÈÑÇí ãÚÏá åÇ//
float**p=new float*[m+1];
for(int i=0;i<m;i++)
{p[i]=new float [n+1];}
cout<<"Lotfan nomarat ra vared konid:";
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{cin>>p[i][j];}
}
//--------------محاسبه معدل هر یک از درس ها ----------------//
for(int j=0;j<n;j++)
{
for(int i=0;i<m;i++)
{
s+=p[i][j];
}
a[j]=s/m;
s=0;
}
//---------------تعیین درس با بیشترین معدل---------------//
max=a[0];
for(int j=0;j<n;j++)
{
if(a[j]>max)
{max=a[j];}
}
cout<<"Darse ba bishtarin moadel:"<<(j-1);
getch();
return(0);
}
hamid_hr
سه شنبه 05 اسفند 1393, 13:40 عصر
خب اون متقییر j فقط داخل حلقه قابل شناسایی هست
cout<<"Darse ba bishtarin moadel:"<<(j-1);
این خطو انتقال بدین به داخل حلقه
اینطوری میشه
for(int j=0;j<n;j++) {
if(a[j]>max)
{
max=a[j];
}
cout<<"Darse ba bishtarin moadel:"<<(j-1);
}
*Fatemeh*
سه شنبه 05 اسفند 1393, 13:49 عصر
اخه اینطوری قبل از این که همه ی عضو ها با max چک بشن j-1 چاپ میشه!!
یعنی ممکنه توی یه حالتی دومین خونه از ارایه چاپ بشه و دیگه خونه های بعد چک نشن
این طورنیس؟؟
*Fatemeh*
سه شنبه 05 اسفند 1393, 13:54 عصر
جالبه اگه عبارتj-1 رو توی" " بگذارم ،بدون هیچ خطایی عبارت چاپ میشه!!!!!!:متعجب:
rahnema1
سه شنبه 05 اسفند 1393, 14:50 عصر
این خطا تغییر بدید
float a[n],b[m];//
به این صورت
float* a = new float[n];
float* b = new float[m];
اون آخر هم به این صورت
max=a[0];
int dars = 0;
for(int j=0;j<n;j++)
{
if(a[j]>max)
{
max=a[j];
dars = j;
}
}
cout<<"Darse ba bishtarin moadel:"<<(dars+1);
*Fatemeh*
سه شنبه 05 اسفند 1393, 19:37 عصر
درست شد ولی ...:متفکر:
چرا حتما اون ارایه های aوb باید از نوع پویا باشه؟؟؟
اگه متغیر dars رو تعریف نمیکردیم چی میشد؟؟خب باید همون j-1چاپ میشددیگه!!!!یعنی فقط چون توی حلقه قرار نداشت از بین میرفت و کامپایلر خطامیگرفت؟؟؟؟
rahnema1
سه شنبه 05 اسفند 1393, 19:58 عصر
درست شد ولی ...:متفکر:
چرا حتما اون ارایه های aوb باید از نوع پویا باشه؟؟؟
مطابق با استاندارد زبان ++c وقتی یک آرایه را تعریف می کنیم داخل دو تا برکت باید یک عبارت ثابت باشه مثل 6 و 8 و متغیری مثل n و a و b نمیتونه باشه. برای این کار آرایه پویا یا ساختارهای دیگه استفاده می شه
اگه متغیر dars رو تعریف نمیکردیم چی میشد؟؟خب باید همون j-1چاپ میشددیگه!!!!یعنی فقط چون توی حلقه قرار نداشت از بین میرفت و کامپایلر خطامیگرفت؟؟؟؟
ما مفهوم حوزه یا scope را در زبان ++c داریم. به این معنا که هر متغیر در حوزه یا محدوده خاصی معنادار هست و خارج از اون معنا نمیده
وقتی که حلقه for ایجاد می کنیم یک حوزه به نام حوزه بلاک block ایجاد میشه که متغیر j تنها داخل اون معناداره
جدا از این مطلب فرض هم بگیریم j خارج از حلقه هم معنا داشت میدونید j برابر چی می شد می شد؟ آخرین عددی که در حلقه قرار داشت یعنی برابر n می شد! که شما با اون نمیتونستید اندیس بیشترین نمره را بدست بیارید!!
*Fatemeh*
سه شنبه 05 اسفند 1393, 21:01 عصر
خیلی ممنون
با توضیح های عالی و جامعتون به راحتی متوجه شدم:لبخندساده:
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.