【问题标题】:Altering a matrix parameter within a method changes the original matrix更改方法中的矩阵参数会更改原始矩阵
【发布时间】:2013-04-19 05:03:03
【问题描述】:

当我调用名为 Vyměň 的方法时(它具有矩阵“matice”作为形式参数),但是当方法结束时,实际矩阵“a”(不应更改)a 被覆盖。为什么?

static int[,] Vyměň(int sloupec, int[,] matice, int [] vektor)
    {
        for (int i = 0; i < matice.GetLength(0); i++)
        {
            matice[i, sloupec] = vektor[i];
        }
        return matice;
    }

    static void Main(string[] args)
    {
        int[,] a = new int[3,4];
        int[] b = new int[3];

        a = Čti(); //Method Čti works fine
        for( int i = 0; i <3; i++)
        {
            b[i] = a[i, 3];
        }

        int detA = determinanty.det3(a);
        Vypis(a);
        int detX = determinanty.det3(Vyměň(0, a, b));
        Vypis(a);
        int detY = determinanty.det3(Vyměň(1, a,b));
        Vypis(a);
        int detZ = determinanty.det3(Vyměň(2, a,b));
        Vypis(a);

        double x = detX / detA;
        double y = detY / detA;
        double z = detZ / detA;
        Console.WriteLine("kořen x = {0}", x);
        Console.WriteLine("kořen y = {0}", y);
        Console.WriteLine("kořen z = {0}", z);

    }
}

【问题讨论】:

    标签: c# matrix


    【解决方案1】:

    在 C# 中数组是通过引用传递的,您正在更改方法内部的矩阵值。

    如果不想这样做,请使用数组的克隆来传入方法。

    【讨论】:

    • 数组不是通过引用传递的……其实nothing默认是通过引用传递的。您正在传递对数组按值 的引用。有区别。
    【解决方案2】:

    我猜你的形式参数是指值类型..
    但是由于您使用的是数组(引用类型),因此它们作为引用类型传递。

    【讨论】:

      【解决方案3】:

      数组是引用类型 - 因此将这种类型的变量放入方法中不会创建值的副本,而是让方法修改该值。

      如果您需要数组/矩阵类型的真正“值”语义,您需要创建自己的类型,强制您创建副本以修改值(类似于string)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 2018-10-06
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多