Как передать массив между методами? - PullRequest
3 голосов
/ 05 марта 2020

Я следую в книге и пробую «испытания». Здесь я сталкиваюсь с проблемой правильного возврата и передачи массива между методами. Что-то идет не так с возвратом массива, особенно из второго метода, а затем передачей его третьему для печати. ​​

Я понимаю стек, кучу, значения и ссылки на концептуальном уровне, но что-то явно идет не так. Каждый метод работает иначе.

using System;

namespace PracticeArray
{
    class Program
    {
        static int[] GenerateNumbers()
        {
            Console.WriteLine("Enter a number to generate array from:");
            string input = Console.ReadLine();
            int inputNumber = Convert.ToInt32(input);

            int[] generatedArray = new int[inputNumber];
            for (int i = 0; i < generatedArray.Length; i++)
            {
                generatedArray[i] = i;
            }

            return generatedArray;
        }

        static int[] Reverse(int[] arrayToReverse)
        {
            int count = arrayToReverse.Length;

            int[] arrayToReturn = new int[count];

            count--;

            for (int i = 0; i < arrayToReturn.Length; i++)
            {
                arrayToReturn[i] = arrayToReverse[count--];

            }

           return arrayToReturn;
        }

        static void PrintNumbers(int[] numbersToPrint)
        {

            foreach (int singleNumber in numbersToPrint)
            {
                Console.Write(singleNumber + ", ");
            }
        }

        static void Main(string[] args)
        {

            int[] numbers = GenerateNumbers();
            Reverse(numbers);
            PrintNumbers(numbers);

        }
    }
}

1 Ответ

3 голосов
/ 05 марта 2020

Проблема

Массив, который вы возвращаете, является новым массивом:

Посмотрите на вашу Reverse функцию. Вы создаете новый массив с именем arrayToReturn и возвращаете этот массив. Вы также никогда не изменяете исходный входной массив arrayToReverse.

        static int[] Reverse(int[] arrayToReverse) // this input array is never modified
        {
            int count = arrayToReverse.Length;
            // ...
            arrayToReturn = new int[count]; // Here is the new array
            // ...
            return arrayToReturn; // you return the new array
        }

Теперь посмотрите, где вы вызвали Reverse, в котором вы передали несколько сгенерированных чисел, но вы игнорируете возвращаемое значение функции, поэтому вы никогда не найдете что новый массив. Помните, что мы уже установили выше, что вы не изменяете элементы входного массива. Так что numbers останется без изменений.

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            Reverse(numbers); // you ignored the return value of `Reverse`
            PrintNumbers(numbers); // These are the original unreversed numbers
        }

Исправить

Опция # 1 - Новая переменная для сохранения результата

Чтобы исправить это, сохраните массив, возвращенный из Reverse в переменной и выведите эти числа.

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            int[] reversedNumbers = Reverse(numbers);
            PrintNumbers(reversedNumbers);
        }

Опция # 2 - Повторное использование той же переменной для сохранения результата

В этой опции вы просто отбрасываете исходный массив, беря новый массив обращенных чисел, возвращаемый из Reverse и присваивающий его переменной numbers. После этого присваивания numbers будет ссылаться на обращенный массив, который был возвращен из Reverse. Исходный массив потерян и забыт - в конце концов мусор собрал.

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            // repurpose the `numbers` variable to store the result.
            numbers = Reverse(numbers);
            PrintNumbers(numbers);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...