請問各位大大一下,
分隔線以下這段程式碼是利用學校電腦裡Microsoft Visual Studio .NET 2003的C++寫出來的!
之後利用 Microsoft Visual Studio 2005 裡的C++貼上這段程式碼(橘色部分是針對2005版修改的,在2003沒有這段!)
但我在進行編譯時為何會在紅色的部分出現這段錯誤" error C2065: 'i' : 未宣告的識別項"
在2003版裡面可以很順利的完成這段程式碼,在2005版裡卻會有這個問題存在...
想麻煩各位精通C++程式設計的大大解答一下~謝謝各位!!!

PS:以下是我安裝針對Microsoft Visual Studio 2005的更新:KB926603KB932231

==================================================================

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
double dScore[50];
for(long i=0;i<50;i++){
cout<<"請輸入第"<<i+1<<"位同學的成績(負表示結束): ";
cin>>dScore[i];
if(dScore[i]<0)
break;
}
cout <<"成績列表:";
for(long j=0;j<i;j++){
cout << dScore[j]<<" ";
}


double dSum=0;
for(long j=0;j<i;j++){
dSum+=dScore[j];
}

double dCount=0;
for(long j=0;j<i;j++){
if (dScore[j]<60)
dCount++;
}
cout<<endl;

cout<<"總分: "<<dSum<<endl;
cout<<"平均: "<<dSum/i<<endl;
cout<<"不及格人數: "<<dCount<<endl;

system("PAUSE");
return 0;
}
文章關鍵字
已經很明確告訴你變數 i 沒有宣告
雖然不知道為何.NET 2003沒有挑出錯誤!
但是i 的生命週期不在後面幾個for迴圈之中吧!

變數 i 的 life cycle 在上個 迴圈中結束了 所以之後的程式碼區段無法使用 變數 i

tuanyang wrote:
雖然不知道為何.NET 2003沒有挑出錯誤!
但是i 的生命週期不在後面幾個for迴圈之中吧!


因為那個是 2003 的 OOXX BUG
private void button5_Click(object sender, EventArgs e)
{
for (int i = 0; i < 50; i++)
{
}

for (int i = 0; i < 50; i++)
{
}
}
<= 上面那段程式碼 在 2003 Compile 會掛喔 會跟你說 i 重複定義 =_=!

allen_hsiao wrote:
已經很明確告訴你變數...(恕刪)


但是如果再給他宣告一次...
程式馬上就出現錯誤而跳離了......




chiaak wrote:
變數 i 的 li...(恕刪)


看來真的是2003版的BUG了......
這幾天要再去找老師討論討論了......
這時就是寫程式習慣的問題了~

我某資工的朋友跟我說~他老師最討厭看到的就是
宣告在迴圈裡的i,j,k,l.......

實際上想想也是~你可能這個迴圈用完後,等一下還要再用一次,就會不自覺的再宣告一次,到最後,你連自己有沒有宣告過都忘了,尤其是碰到多重迴圈的時候

我聽了之後,之後在寫程式的時候都會先在最前面先宣告

///////////////
int i,j

for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
{
}
}

for(i=0;i<max;i++)
{

}

///////////////

以上跟2003的問題沒有任何關係,我只有"聽說".Net 2005好像不能接受在迴圈裡的宣告"的樣子"
因為小弟還在用VC6...老闆說要把程式碼轉到.Net 2005,我都裝做沒聽到~~
這不能算 bug 啦!

2005 更新的 compiler,其中在變數的處理上,由原本的 Global、Module、Local 三種範圍增加了 block 範圍。

因此在 2003 的時候無論宣告在迴圈內或迴圈外,結果都一樣。所以在第一個迴圈宣告過,第二個迴圈就不能宣告了,因為在同一個範圍內。

到了 2005,迴圈內宣告和迴圈外宣告意思是不一樣的。每一個block可以宣告自己的變數。
本生物已配置全天候戰鬥系統~ 手機不通、Skype 離線時,請託夢,或留言!
冰澗楓 wrote:
但是如果再給他宣告一次...
程式馬上就出現錯誤而跳離了......


當然不行,如果再宣告一次 i ,這個 i 和上一個 i 是完全不同的。

您的程式必須將前一個迴圈的變數值帶到下一回圈,因為是不同的迴圈所共用的變數,必須宣告在迴圈外,就像不同函數共用的變數必須宣告在函數外一樣。

所以改成這樣就可以了

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
double dScore[50];
long i;
for(i=0;i<50;i++){
cout<<"請輸入第"<<i+1<<"位同學的成績(負表示結束): ";
cin>>dScore[i];
if(dScore[i]<0)
break;
}
cout <<"成績列表:";
for(long j=0;j<i;j++){
cout << dScore[j]<<" ";
}

double dSum=0;
for(long j=0;j<i;j++){
dSum+=dScore[j];
}

double dCount=0;
for(long j=0;j<i;j++){
if (dScore[j]<60)
dCount++;
}
cout<<endl;

cout<<"總分: "<<dSum<<endl;
cout<<"平均: "<<dSum/i<<endl;
cout<<"不及格人數: "<<dCount<<endl;

system("PAUSE");
return 0;
}
本生物已配置全天候戰鬥系統~ 手機不通、Skype 離線時,請託夢,或留言!
Ricado wrote:
當然不行,如果再...(恕刪)


感謝Ricado大大的熱心指導!!!
現在終於可以了!!!

今天跑去跟老師討論...
結果老師看了程式碼後說沒問題...
因為老師他自己也是用2003的版本,還當場把一樣的程式碼輸進去...
結果是正常的......當場不知該接什麼話

學校沒提供相同的版本給學生使用,只好用不同的版本來寫......

一改版的寫法就不一樣,真是令人頭痛...
當初開始使用也是,2003的不用輸入#include <iostream>就可執行了
之後使用2005的版本沒打這串字,一直跟我說一堆東西未宣告...
弄了好久才知道要輸入這排字...

在這邊再次感謝Ricado大大的熱心指導
也謝謝各位熱心的回應!
冰澗楓 wrote:
結果老師看了程式碼後說沒問題...
因為老師他自己也是用2003的版本,還當場把一樣的程式碼輸進去...


沒問題是正常的。

這段程式碼不管2003或2005都可以用。

因為您要的 i 是一個 local 的變數,對2003來說,不管宣告在迴圈內或迴圈外都是一樣的。

您的老師不會用這點來反駁你吧?
本生物已配置全天候戰鬥系統~ 手機不通、Skype 離線時,請託夢,或留言!
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!