2011-08-10 82 views
0

好吧我很困惑,我有:一個int變量一個字符串數組和一個所有應該會的語句。它非常標準的循環數組結構。C#循環字符串數組錯誤

public class Form1 : System.Windows.Forms.Form 
{ 

    public int ticker = 0; 
    public string[] pictureArray = new String[] { 
      "image01.jpg", 
      "image02.jpg", 
      "image03.jpg", 
      "image04.jpg", 
      "image05.jpg", 
      "image06.jpg", 
      "image07.jpg", 
      "image09.jpg", 
      "image10.jpg", 
      "image11.jpg", 
      "image12.jpg", 
      "image13.jpg", 
      "image14.jpg", 
      "image15.jpg", 
      "image16.jpg", 
      "image17.jpg", 
      "image18.jpg", 
      "image19.jpg", 
      "image20.jpg", 
      "image21.jpg", 
      "image22.jpg" 
     }; 
... 
     if (this.ticker < 21) 
     { 
      this.ticker++; 
     } 
     else 
     { 
      this.ticker = 0; 
     } 

     MessageBox.Show(pictureArray[ticker]); 

它運行正常,直到股票是> 21,然後崩潰,並指出IndexOutOfRange但如果我是說改變的MessageBox只是打印股票它是好的,我沒有錯誤。現在我已經看過類似的問題,但問題是我是一名PHP程序員,如果答案與我的情況有關,我不確定其中的一些人。

任何幫助將不勝感激,我認爲我有這裏的所有相關信息,如果不是我道歉。但是,一切工作,直到它開始回收數組並再次運行數組。我只是感到困惑。

+0

'this.ticker'從哪裏來?另外,當然你不希望'if(this.ticker

+0

當你聲明你是一個PHP程序員時,我相信你的答案就是在你面前凝視你。數組索引從0開始到最大項目。所以如果你閱讀max items + 1(例如'this.ticker'),那麼你會得到一個IndexOutOfRange Exception。將其更改爲<= 21. – 2011-08-10 14:57:00

+0

拋出異常時'ticker'的值是多少?它是從'pictureArray [ticker]'行拋出的嗎?這段代碼對我來說很好。 –

回答

12

你錯過了image08.jpg,這意味着在你的數組中只有21個條目,而不是22個。因此當ticker是21時,你會得到一個異常。使這個更強勁的

一種方法是使用:

if (ticker < pictureArray.Length - 1) 
{ 
    ticker++; 
} 
else 
{ 
    ticker = 0; 
} 

或者有一個條件:

ticker = ticker < pictureArray.Length - 1 ? ticker : 0; 

或者與理查德的「無條件的增量,條件復位」。

或可能有些簡單:

ticker = (ticker + 1) % pictureArray.Length; 

誠然,在這種情況下,將導致你錯過了什麼我懷疑是真正的問題 - 你沒有得到所有你期待有圖像。

+0

並且他在顯示第一個元素之前遞增數組,因此他總是跳過0. – 2011-08-10 15:02:38

+0

OMG!我一直在看這一小時,試圖找出它,我不能相信這是一個簡單而愚蠢的感謝之人。 – BrandonS

+0

這不會導致IndexOutOfRangeException嗎?你會得到一個點,其中ticker等於長度,因此超出範圍。 (這就是爲什麼我在if語句之外做了ticker ++) –

2

如果股票= 20,你點擊它高達21

然後嘗試索引0基於21元素數組的21位

你是否應該ticker < 20

編輯 - 哈哈,看起來像這會解決你的索引問題,Jon的答案是正確的。

這很有趣。

2

更改它這樣做:

MessageBox.Show(pictureArray[ticker]); 

ticker++; 
if (ticker >= pictureArray.Length) 
{ 
    ticker = 0; 
} 

這樣,如果你改變pictureArray的大小也將進行調整。

1

問題是,你永遠不會讀索引0。首先在讀取第一個元素之前增加this.ticker。在每個數組位置顯示字符串的值後,您應該遞增。

因此,最終會發生什麼是你的索引21而不是20因此IndexOutOfRangeException

0

實際上你有21件你失蹤image08.jpg!所以你應該改變條件爲< 20。或一般而言< PictureArray.Length - 1

+0

wooo !!我沒有注意到人們如此快地發佈了4個答案! +1其他人! –

0

BrandonS,您的代碼的問題非常微小,但結果很糟糕。你的代碼 流量:

  1. 首先要檢查股票
  2. 的值如果小於,你遞增到1,否則讓它0
  3. 您打印數組的值

所以, public string [] pictureArray = new String [] {「image01.jpg」,「image02.jpg」}; // 2

ticker = 0 
if (ticker < 2) 
    ticker++; // STEP 1 
else 
    ticker = 0; 
MessageBox.Show(pictureArray[ticker]); // STEP 2 

ticker Image Shown 
0   image02.jpg 
1   image03.jpg ????? 

陣列檢查,你遞增,然後diaplying,所以顯示的值已經是1領先於股票之後。 要解決它們的不同之處: - 您可以將if子句(代碼< 21)替換爲(代碼< pictureArray.Length -1)。 增加訪問前一張圖片後,使用pictureArray [ticker-1]。 顯示後或增量。 已經寫了一個有效的小代碼。結果也顯示出來。

string[] pictureArray = new String[] {"image01.jpg","image02.jpg}; 
     int ticker = 0; 
     do 
     { 
      if (ticker < pictureArray.Length - 1) 
       ticker++; 
      else 
       ticker = 0; 
      Console.WriteLine("Ticker = " + ticker + " Image = " + pictureArray[ticker]); 
     } while (true); 

    Results : 
Ticker = 1 Image = image02.jpg 
Ticker = 0 Image = image01.jpg 
Ticker = 1 Image = image02.jpg 
Ticker = 0 Image = image01.jpg 

的下面dispaly語句西港島線lalso結果與上述相同的: 如果(股票== 0) Console.WriteLine( 「股票代碼=」 +股票+ 「圖片=」 + pictureArray [0]); else Console.WriteLine(「Ticker =」+ ticker +「Image =」+ pictureArray [ticker]);

如果您可以先顯示然後遞增或遞增之前將其值保存在其他變量中,並使用該變量來顯示最好的而不是上面的變量。

int displayTicker = 0; 
if (ticker < 2) { 
    displayTicker =ticker; 
    ticker++; 
} else { 
    displayTicker = ticker = 0; 
} 
MessageBox.Show (pictureArray[displayTicker]); 

我相信這個選項會是最好的。在這種情況下,最好有2個變量,而不是保留一個並檢查它。

希望這有助於。