【问题标题】:Why does every item in this array get overwritten with the value of the last item? [duplicate]为什么这个数组中的每一项都会被最后一项的值覆盖? [复制]
【发布时间】:2016-07-02 03:09:00
【问题描述】:

我正在开发一个 C# Windows 窗体程序,并且正在练习遗传算法的基础知识。我正在尝试做的事情没有按预期工作如下:

我的代码初始化了两个锯齿状数组和一个普通数组。锯齿状数组每个有 20 项,而普通数组有 8 个。普通数组存储个体的基因组,锯齿状population 数组存储这些individual 数组的数组。

当我调用generate_population() 时,它应该以正确的长度初始化锯齿状数组中的每个数组,然后使用 for 循环使用create_indiv() 的返回填充所述数组(该函数返回一个 8 项 @987654325 @array),然后它通过访问人口数组的 i 索引并打印该值来将数组打印到列表框。

这一切都很好,它成功生成了一组唯一的individuals,并通过访问和打印人口数组中的特定索引来打印这些人。

问题是,如果我运行一次generate_population() 函数,然后尝试在另一个函数中使用population 数组,它表明每个索引值都包含相同的individual — 数组中生成的最后一个.

例子:

generate_population() 中生成时,population[][] 显示自己被这些数组填充:

  • 12345678
  • 87654321
  • 13579063

如果我尝试遍历,并在另一个函数中打印 population[][] 的所有值,在我调用 generate_population() 之后,我会得到:

  • 13579063
  • 13579063
  • 13579063

有人发现问题吗?此代码不代表完整的程序,仅代表我认为我将问题隔离到的部分。我 90% 确定问题发生在 generate_population(),但我可能错了。 如有必要,我可以发布完整的程序。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int count = 0;
        int count2 = 0;
        int[] individual = new int[8];
        int[][] population = new int[20][];
        int[][] workingpop = new int[20][];

        Random seed = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        public int[] create_indv()
        {
            for (int i = 0; i <= 7; i++)
            {
                individual[i] = seed.Next(0, 10);
            }
            return individual;

        }

        public string genomestr(int[] indiv)
        {
            StringBuilder builder = new StringBuilder();
            foreach (int value in indiv)
            {
                builder.Append(value);
            }
            string fin = builder.ToString();
            return fin;
        }

        public int[][] generate_population(int number)
        {
            for (int i = 0;i < number; i++)
            {
                population[i] = new int[8];
                workingpop[i] = new int[8];
            }
            for (int i = 0; i < number; i++)
            {
                population[i] = create_indv();
                workingpop[i] = population[i];


                int l = i + 1;
                this.popchart.Items.Add("Creature #" + l + ": " + genomestr(population[i]));
            }
            return population;
        }

        private void pop_Click(object sender, EventArgs e)
        {
            popchart.Items.Clear();
            generate_population(20);
        }
    }
}

【问题讨论】:

  • 这只是通常的“对象是引用,在多个地方使用同一个对象意味着一个对象的更改会影响一个对象被引用的所有地方”的一种变体。有关已解决此方案的许多现有 Stack Overflow 问题的一个示例,请参阅标记的副本。

标签: c# arrays forms


【解决方案1】:

将此行放入方法 create_indv():

int[] individual = new int[8];

你总是覆盖“个人”。

population[i]

指向同一个“个体”

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2014-09-06
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    相关资源
    最近更新 更多