未正确访问全局数组
本文关键字:全局 数组 访问 | 更新日期: 2023-09-27 18:34:41
以下是我当前的代码:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int[] trialArray = new int[10];
public int trialCounter = -1;
private void button1_Click(object sender, EventArgs e)
{
bool button1Click = true;
if (button1Click == true)
{
ITIpanel.Visible = true;
for (int i = 0; i < trialArray.Length; i++) { trialArray[i] = -1; } // Set default value through array
int counter = 0;
Random rnd = new Random();
while (counter < 10 / 2)
{ // Red trials, fill half array
int index = rnd.Next(0, 10 - 1);
if (trialArray[index] == -1) { trialArray[index] = 1; ++counter; } //if unchanged value, change it
}
while (counter < 10)
{
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 2; ++counter; }
}
}
}
private void ITIpanel_Paint(object sender, PaintEventArgs e)
{
if (ITIpanel.Visible == true)
{
trialCounter += 1;
timer1.Enabled = true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
ITIpanel.Visible = false;
timer1.Enabled = false;
if (trialArray[trialCounter] == 1) { redstimPanel.Visible = true; }
else { bluestimPanel.Visible = true;}
if (trialCounter == 9) { Application.Exit(); }
}
public int counter = 0;
public event EventHandler Clicked5TimesEvent;
private void OnClicked5TimesEvent()
{ if (Clicked5TimesEvent != null) { Clicked5TimesEvent(this, EventArgs.Empty); } }
private void bluestimPanel_MouseDown(object sender, EventArgs e)
{
//FR requirement
counter++; if (counter % 5 == 0) { redstimPanel.Visible = false; ITIpanel.Visible = true; }
}
private void redstimPanel_MouseDown(object sender, EventArgs e)
{
//FR requirement
counter++; if (counter % 5 == 0) { redstimPanel.Visible = false; ITIpanel.Visible = true; }
}
}
}
如您所见,我正在尝试创建一个包含 10 个项目的全局数组。在按钮上单击,应该更改 10 个项目,以便一半包含值 1,另一半包含值 2。
然后,在计时器滴答声上,根据 trialCounter
中的值,确定要访问的数组部分,它应该显示redstimPanel
或bluestimPanel
。
因此,如果 'trialCounter' 等于 8,而 TrialArray 中的 8 等于 1,则 'redstimPanel' 应该变为可见。或者,如果"TrialArray"中的8等于2,则"bluestimPanel"应该变为可见。
但是,这并没有像我希望的那样工作。因此,我的代码显然存在一些问题。大家有什么建议吗?
您永远不会重置计数器,或者让第二个循环(设置 2s 的循环(成为完整数组。
随机数 rnd 也存在错误。下一个(a,b( a - 下限(含(,b - 上限(不包括(。所以它应该是 rnd。下一页(0,10(;因此,您有机会填充最后一个数组位置。
while (counter < 10 / 2) { // Red trials, fill half array
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 1; ++counter; } //if unchanged value, change it
}
//Counter on the first loop here is already 5 (it exited the previous loop)
//So allow it to get to 10, and populate the FULL array.
while (counter < 10) {
int index = rnd.Next(0, 10);
if (trialArray[index] == -1) { trialArray[index] = 2; ++counter; }
}
请允许我给你一些关于你的代码的提示和解释:
首先,您可能希望该局部 button1Click 变量稍后知道该按钮是否已被单击。要使其正常工作,您应该将其放在该函数之外,否则它永远不会被使用,并且每次单击按钮都是如此,如下所示:
bool button1Click = false;
private void button1_Click(object sender, EventArgs e)
{
if (!button1Click)
{
当你有一个条件时,你希望代码决定,一个表达式是真还是假,你可以省略"== true"部分,因为它不会添加任何新的东西。
你有两个时间。你的想法是运行计数器直到 5,使用第一段代码,然后从 5 到 10 运行第二段代码。现在让我试着解释一下到底发生了什么。计数器将继续进行,直到 5 次以随机索引填充 1。然后在 5 处,while 中的表达式将变为 false,并且它从循环中中断。由于第二个 while 具有完全相同的表达式,它只是避开它并继续前进。众多解决方案之一是在循环中有一个 if,如下所示:
而(计数器<10({ 如果(计数器<5( { 填充红色 } 还 { 填充蓝色 }}
填充数组中值的方式。你有没有想过当同一个索引被多次生成时会发生什么?这意味着它将覆盖以前的值,而某些索引将保持 -1。