PDA

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 عصر
خیلی ممنون

با توضیح های عالی و جامعتون به راحتی متوجه شدم:لبخندساده: