2015-10-13 97 views
-3

所以我一直在woking一個控制檯遊戲一會兒,我希望使用.txt文件來保存地圖。此代碼打開並存儲txt文件內容:索引超出了for循環中數組的範圍C#

 static void LoadMap(string fname) 
    { 
     string _org = File.ReadAllText("Maps/" + fname + ".txt"); 
     _org.Split(','); 
     string[] _tmp = new string[_org.Length]; 
     for (int i=0;i<_org.Length;i++) 
     { 
      _tmp[i] = _org[i].ToString(); 
     } 
     //This line has the error 
     for (int i=0;_tmp[i]!="$";i+=2) 
     { 
      mapwidth += 1; 
     } 
     for (int i=0;i<_tmp.Length;i++) 
     { 
      leveldata.Add(_tmp[i]); 
     } 
    } 

我收到此錯誤:索引超出了數組的範圍。我無法找出原因。誰能幫忙?謝謝

+2

你都知道,你是你的遞增索引2時過,對吧?如果_tmp數組中有5個對象,則第四個循環會出錯,因爲它將是_tmp [0],_tmp [2],_tmp [4],_tmp [6](因此不存在於數組)。 –

+1

'for(int i = 0; _tmp [i]!=「$」; i + = 2)'不檢查'_tmp'上的邊界,因此它很容易讓索引超出邊界,它確實如此。有些東西與你對'_tmp'內容的假設是不正確的,但是你沒有顯示那是什麼,所以我們不能幫助你,而不是說它顯然在這裏。 – Enigmativity

+0

另外,對_org對象的方法String.Split的調用是否有用,它沒有任何用處。 –

回答

0

我不是超級確保你在這裏做了什麼,但我覺得foreach可能是朝正確方向邁出的一步。

首先,我在您提供的代碼中注意到了幾件事情。

string _org = File.ReadAllText("Maps/" + fname + ".txt"); 
    _org.Split(','); 

在這裏,您已經攝入了文本文件,並用逗號分隔符將_org分開。儘管你從未真正將分割數組賦值給一個變量。 _org仍然是string,而不是string[]

string[] _tmp = new string[_org.Length]; 
    for (int i = 0; i < _org.Length; i++) 
    { 
     _tmp[i] = _org[i].ToString(); 
    } 

在此塊中,我們已經設置_tmp如使用_org長度的字符串數組。在這種情況下,Length屬性將檢索字符串_org中的字符數。假設_org設置爲"foo"_tmp陣列的大小,現在3.(0,1,2)是

你然後繼續加載_tmp與轉換爲字符串的_org第n個字符。

在這一點上我們有以下變量。

_org = "foo" 
_tmp = {"f","o","o"} 

接下來的一部分讓我有些不屑一顧,因爲我無法確定你想要完成什麼。

for (int i = 0; _tmp[i] != "$"; i += 2) 
    { 
     mapwidth += 1; 
    } 

你是在一個for循環,直到_tmp[i]等於"$",並且每次使用過的i += 2循環移動時要添加到2i。這個邏輯將打破這個循環,直到達到"$",或者如果i增長超出數組範圍,它將引發異常。

你接下來要添加一個到mapwidthi

每兩個增量在您要添加的_tmp數組的內容這最後的塊leveldata

for (int i = 0; i < _tmp.Length; i++) 
    { 
     leveldata.Add(_tmp[i]); 
    } 

現在的好東西,foreach。 我已經假設你想將_org設置爲一個數組,並且你希望所有不是「$」的東西。記住,這應該完成你所要做的事情,儘管我不確定第二個循環中遞增2的目的,所以我現在已經離開了它。

static void LoadMap(string fname) 
{ 

    string[] _org = File.ReadAllText("Maps/" + fname + ".txt").Split(','); 

    foreach (var _tmp in _org) 
    { 

     if (_tmp != "$") 
     { 
      mapwidth += 1; 
     } 

     leveldata.Add(_tmp); 
    } 
} 

如果你想繼續編碼它始終是一個好主意,讓對基礎知識把握好。

雖然這裏有點過時是一個很好的教程由微軟編程的基礎知識在C#: C# Programmer's Reference

+0

感謝這是我需要感謝 – Programmer2120

3

檢查變量i沒有超出數組的Length - 1的值。

static void LoadMap(string fname) 
{ 
    string _org = File.ReadAllText("Maps/" + fname + ".txt"); 

    _org.Split(','); 

    string[] _tmp = new string[_org.Length]; 

    for (int i = 0;i < _org.Length; i++) 
    { 
     _tmp[i] = _org[i].ToString(); 
    } 

    for (int i = 0;i < _tmp.Length && _tmp[i] != "$"; i += 2) 
    { 
     mapwidth += 1; 
    } 

    for (int i = 0;i < _tmp.Length; i++) 
    { 
     leveldata.Add(_tmp[i]); 
    } 
} 
相關問題