返回列表 發帖

C#資料陣列...救命>"<

執行後和我說:並未將物件參考設定為物件的執行個體
錯誤的地方在下面的紅色字
這到底是甚麼問題啊...

static  office.worker[] arr = new office.worker[100];
office.worker  temp = new office.worker() ;
temp.offocename = sr.ReadLine();

temp.number = long.Parse (sr.ReadLine());
                           
                           
temp.name = sr.ReadLine();
                        
temp.subofficename  = sr.ReadLine();
                           
temp.work =sr.ReadLine();
                        
temp.money = long.Parse (sr.ReadLine());

                        
arr[j ].money = temp.money;
arr[j ].subofficename=temp.subofficename;
arr[j ].work=temp .work ;
arr[j ].name=temp.name ;
arr[j ].number = temp.number;
arr[j ].offocename =temp.offocename  ;

雖然看到有人在基地問這個很意外...不過回答如下

如果 office.worker 不是一個 primitive type 或是 struct
並且假設沒有其他 compile error,針對於那個執行錯誤
這段程式就有一個很明顯的錯誤:

static  office.worker[] arr = new office.worker[100];
之後應當要加上
for (int i = 0; i < arr.length; i++)
    arr = new office.worker();

這是一個很多人會犯的錯誤 (在 JAVA / C# 裡)
解釋上就是你第一行是宣告說你要一個 office.worker 的陣列,長度是 100
但是你卻沒有對每一個元素作初始化,這樣一來 arr 中的所有元素都是 null
當然會錯~ 要記住 C# 對於 class 物件存的是 Reference~

-------------------------------------------------------------
如果懂 C 的話,用 C 來寫的話就是你的程式只有
office.worker* arr = new office.worker[100];
卻沒有對 arr 中的東西指定要指到哪裡去,所以當然不對。

[ 本文最後由 ffantasy1999 於 2009-11-12 16:54 編輯 ]

TOP

咦…
我沒進錯版吧
想不到會有人來討論c#
樓上也真專業

TOP

你的 j 呢?
提供的程式碼沒看到j的宣告. (感覺是要用for迴圈包起來跑的樣子)

offocename 是拼錯了嗎 =__= ?

還有arr陣列的東西跟temp看起來都是同物件,可以直接用=或是clone就可以了,不用寫那麼多行~

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

樓樓上的~ new 了以後會自動配與記憶體位置的~ (除非記憶體空間不夠或出錯)

在C++ new了以後做清空動作是為了後面使用不出錯. (修正 : 後來想到C沒有new,是用malloc)
(因為new以後拿到的空間裡面的值不一定是0,如果拿到的空間之前有別的程式用過,值就有可能不是0)
一般會在初始化的時候給值或是用memset去把它清空.

[ 本文最後由 Cheng 於 2009-11-12 22:55 編輯 ]

TOP

原文由 ffantasy1999 於 2009-11-12 16:47 發表
雖然看到有人在基地問這個很意外...不過回答如下

如果 office.worker 不是一個 primitive type 或是 struct
並且假設沒有其他 compile error,針對於那個執行錯誤
這段程式就有一個很明顯的錯誤:

static  office.wo ...

記得沒錯的話在JAVA宣告陣列時不都會直接初始化嗎?
雖然自行初始化是好習慣啦@@a

TOP

回覆 2# ffantasy1999 的文章

我記得會自己初始化巴
例如 object[] tmp=new object[1000];
當這行跑完後你去看到內容
會發現裡面有1000個null
初始值就是null

再來就是
static  office.worker[] arr = new office.worker[100];
for (int i = 0; i < arr.length; i++)
    arr = new office.worker();
如果這樣寫
complir馬上跳出來跟你說
arr是office.worker[] 格式,而非office.worker格式

至於樓主你的" j "的宣告跑去哪裡阿

TOP

回覆 6# s5891140 的文章

for 裡面確實忘記要 arr 才對 XDD

至於很多人說會自行初始化,
其實自行初始化的是 arr 裡面的值 (初始為 null)
但是 arr 裡面每一個存的都可以想成一個 pointer
所以 pointer 初始為 null
也就是你的 pointer 哪都沒有指到
這樣一來當然不能要 pointer 作 dereference,因為他們沒有指到的東西。
(當然這裡是因為沒有指定要指到哪裡去)

這就是版主那個 runtime error 的來源:
只 allocate 了第一層,卻少了第二層。
所以說他要用 arr[j].xxxx 的時候就沒辦法用~

當然樓上有人說只是要 copy 可以用 Clone()
我覺得也算是正解~ 不過解決的理由跟我的解法一樣
都是把缺少的第二層記憶體 allocate 出來,然後 assign pointer 指過去 =w=

所以我才會用C++那個再舉個例子(對,是C++,個人習慣把C++當作 C 的擴充 XD),
不過似乎反而令很多人誤解了

---------------------------------------------------------------------
用字用詞上各種不精確造成的誤解請多多見諒~
我只是想要針對那個 runtime error 盡可能解釋,
不過似乎表達能力不好 Orz

[ 本文最後由 ffantasy1999 於 2009-11-13 08:56 編輯 ]

TOP

回覆 7# ffantasy1999 的文章

沒關係,你做得很好
知識要講出來才能互相成長

其實你要講的東西我懂
你想講的是只有宣告
因為初始化是NULL
所以並沒有指向任何的資料結構
要另外用for迴圈跑才會有指到

不過這部分我要去寫段程式來實驗看看

TOP

返回列表