无法正确访问全局数组

时间:2012-05-20 22:06:24

标签: c#

以下是我目前的代码:

    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'应变为可见。

然而,这并不像我希望的那样有效。因此,我的代码显然存在一些问题。你们都有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你永远不会重置计数器,或者让第二个循环(设置2s的循环)成为完整数组。

随机数也存在错误,rnd.Next(a,b)a - 下限(包括),b - 上限(不包括)。所以它应该是rnd.Next(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; }
}

答案 1 :(得分:0)

请允许我向您提供有关您的代码的一些提示和一些解释:

首先,您可能希望本地button1Click变量稍后知道是否已单击该按钮。为了实现这一点,你应该把它放在那个函数之外,否则它永远不会被使用,并且每次点击按钮都会成功,如下所示:

bool button1Click = false;
private void button1_Click(object sender, EventArgs e)
{                
    if (!button1Click)
    {
  1. 如果您有条件,您希望代码决定,无论表达式是真还是假,您可以省略“== true”部分,因为它不会添加任何新内容。

    < / LI>
  2. 你有两个时间。你的想法是使用第一段代码运行计数器直到5,然后从第二段代码运行5到10。现在让我试着解释一下实际发生了什么。计数器将持续到5个随机指数填充1。然后在5处,while中的表达式将变为false并且它从循环中突然出现。由于第二个while具有相同的表达式,因此它只是避免它并继续。许多解决方案之一就是在循环中使用if:

    while(counter&lt; 10) {      if(counter&lt; 5)      {          //填红      }      其他      {          //填蓝色      } }

  3. 填充数组中值的方式。您是否考虑过多次生成相同索引时会发生什么?这意味着它将覆盖先前的值,而某些索引将保持为-1。