好的我对此感到困惑,我有:一个int变量一个字符串数组和一个所有应该的语句。它非常标准的循环阵列结构。
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 :(得分: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;
不可否认,在这种情况下会导致您错过我怀疑的真正问题 - 您没有得到您期望拥有的所有图像。
答案 1 :(得分:2)
如果ticker = 20,则单击最多21个。
然后尝试在21位索引基于0的21元素数组。
你的if应该是ticker < 20
编辑 -
哈,看起来虽然这会解决你的索引问题,但Jon的回答是正确的。
这很有趣。
答案 2 :(得分:2)
更改它以执行此操作:
MessageBox.Show(pictureArray[ticker]);
ticker++;
if (ticker >= pictureArray.Length)
{
ticker = 0;
}
这样,如果你改变pictureArray的大小,它也会适应。
答案 3 :(得分:1)
问题是你根本不读索引0。在第一个实例中,在读取第一个元素之前增加this.ticker
。在每个数组位置显示字符串的值后,您应该递增。
最终,最终发生的事情是您将索引设置为21
而不是20
,因此IndexOutOfRangeException
。
答案 4 :(得分:0)
你实际上有21件物品你缺少image08.jpg !!所以你应该把条件改为&lt; 20。或者一般< PictureArray.Length - 1
答案 5 :(得分:0)
BrandonS,你的代码问题非常微小,但结果很糟糕。 您的代码流程:
所以, 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 ?????
检查后,您正在递增,然后进行透支,因此显示的值已经超过了自动收报机1。 计算出不同的方法: - 你可以将if子句(ticker&lt; 21)替换为(ticker&lt; 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
以下显示的陈述将与上述结果相同: if(ticker == 0) Console.WriteLine(“Ticker =”+ ticker +“Image =”+ pictureArray [0]); 其他 Console.WriteLine(“Ticker =”+ ticker +“Image =”+ pictureArray [ticker]);
如果您可以先显示然后递增或在递增之前将其值保存在其他var中,并使用该var来显示最佳结果,而不是上面的那些。
int displayTicker = 0;
if (ticker < 2) {
displayTicker =ticker;
ticker++;
} else {
displayTicker = ticker = 0;
}
MessageBox.Show (pictureArray[displayTicker]);
我相信这个选项会是最好的选择。在这种情况下,最好有2个vars,而不是保留一个并对其进行检查。
希望这会有所帮助。