未正确访问全局数组

本文关键字:全局 数组 访问 | 更新日期: 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 中的值,确定要访问的数组部分,它应该显示redstimPanelbluestimPanel

因此,如果 '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)
    {
  1. 当你有一个条件时,你希望代码决定,一个表达式是真还是假,你可以省略"== true"部分,因为它不会添加任何新的东西。

  2. 你有两个时间。你的想法是运行计数器直到 5,使用第一段代码,然后从 5 到 10 运行第二段代码。现在让我试着解释一下到底发生了什么。计数器将继续进行,直到 5 次以随机索引填充 1。然后在 5 处,while 中的表达式将变为 false,并且它从循环中中断。由于第二个 while 具有完全相同的表达式,它只是避开它并继续前进。众多解决方案之一是在循环中有一个 if,如下所示:

    而(计数器<10({ 如果(计数器<5( { 填充红色 } 还 { 填充蓝色 }}

  3. 填充数组中值的方式。你有没有想过当同一个索引被多次生成时会发生什么?这意味着它将覆盖以前的值,而某些索引将保持 -1。