Как вернуть двумерный массив из функции c

от admin

Передать в функцию и возвратить двумерный массив

Задание — передать массив в функцию, заполнить его, и возвратить указатель на массив. Ошибка происходит в возврате:

return from incompatible pointer type

Но двумерный массив — массив массивов; соответственно тип его будет double ** ?

Артём Ионаш's user avatar

Hardc0re's user avatar

Тип «двумерный массив» автоматически конвертируется в тип «указатель-на-одномерный-массив», который несовместим с типом «указатель-на-указатель». Поэтому неясно, откуда у вас вообще взялся тип double ** .

В вашем случае параметр функции имеет тип double (*)[2] . Вот именно этот тип и следует возвращать из функции, если вам действительно хочется возвращать указатель на оригинальный массив. Т.е. функцию можно объявить так:

А при помощи typedef можно сделать объявление более удобочитаемым.

Однако раз уж ваша функция заточена именно и строго на работу с массивом [3][2] , то возможно стоит поступить даже так:

C++ возвращает 2D-массив из функции

Строка для двойного преобразования C++ (String to double)

Программирование и разработка

Массив — это набор данных подобного типа, хранящихся в непрерывной памяти. И когда мы храним массив внутри массива, он называется 2D-массивом или 2-мерным массивом. Чтобы узнать больше о массивах, обратитесь к статье Массивы в C++.

Массив — это набор данных подобного типа, хранящихся

Когда есть необходимость вернуть 2D-массив из функции, всегда трудно найти способ сделать это, и причина, по которой это сложно, заключается в том, что когда мы возвращаем массив, локальный для некоторой функции, он возвращает только адрес этого массива. и как только функция возвращает адрес завершена, и мы достигли места, где мы ее вызвали. Затем операционная система уничтожит всю память, которая была создана в этой функции, поэтому в этом случае массив, который мы получаем из этого, также уничтожается, и мы сохраняем адрес недопустимой области памяти.

Итак, в этой статье мы увидим, как справиться с этой проблемой.

Методы возврата 2D-массива из функции

здесь мы увидим возврат 2D-массива из функции с использованием следующих методов:

  • Использование динамического массива
  • Использование статического ключевого слова
  • Использование техники Struct

1. Возврат 2D-массива из функции в C++ с использованием динамического массива

Динамический массив помогает нам хранить адреса массивов с помощью указателя. Таким образом, мы можем использовать динамический массив для использования нотации указателя на указатель для динамического выделения и возврата массива. Чтобы узнать больше о динамическом массиве, обратитесь к Динамический массив в C++.

правильный способ вернуть двумерный массив из функции c

Типичная проблема, с которой вы сталкиваетесь, заключается в том, что int a[3][3] = <<1,2,3>,<4,5,6>,<7,8,9>>; в вашем примере относится к памяти, которая восстанавливается после возврата функции. Это означает, что вызывающему абоненту небезопасно читать (неопределенное поведение).

Другие подходы включают передачу массива (который принадлежит вызывающей стороне) в качестве параметра функции или создание нового распределения (например, с использованием malloc ). Структура удобна тем, что может устранить многие ловушки, но она не идеальна для каждого сценария. Вам следует избегать использования структуры по значению, когда размер структуры непостоянен или очень велик.

Что вы используете, когда массив большой? Например, мне нужен двойной массив 44k x 2. — Сагинага

@sAguinaga рассмотрите возможность передачи ссылки на структуру или массив по параметру, а не возврата значения. большое значение, как вы, наверное, догадались, способно исчерпать (оставшееся) хранилище стека. в некоторых случаях можно выбрать возврат структуры или массива, размещенного в куче. — Джастин

Мы можем решить эту проблему, используя память кучи/выделение памяти с помощью stdlib:

Выделение памяти с помощью stdlib может быть выполнено с помощью malloc и calloc.

создание массива:

  • для выделения 5 строк.
  • предназначен для размещения 5 столбцов в каждой строке «i».
  • Таким образом мы создали arr[5][5].

Нам просто нужно отправить этот указатель, который отвечает за доступ к этому массиву, как указано выше.

ответ дан 17 мая ’17, 19:05

Не разыгрывайте результат malloc в C. — крашмстр

Во-первых, вы не можете инициализировать массив вызовом функции; определение языка просто не позволяет этого. Массив char может быть инициализирован строковым литералом, например

массив wchar_t , char16_t или char32_t может быть инициализирован широким строковым литералом, но в противном случае инициализатор должен быть списком значений, заключенным в фигурные скобки.

Во-вторых, у вас несоответствие типов; за исключением случаев, когда это операнд sizeof или унарный & операторы, или строковый литерал, используемый для инициализации другого массива в объявлении, выражение типа «N-элементный массив T «будет преобразовано в выражение типа» указатель на T «, а значением выражения будет адрес первого элемента;

В функции retArr , тип a в выражении «3-элементный массив из 3-элементного массива int «; по приведенному выше правилу это будет преобразовано в выражение типа «указатель на 3-элементный массив int «, или int (*)[3] :

но, как указывает Брендан, однажды retArr выходы a более не существует; возвращаемое значение указателя оказывается недействительным.

Вы также можете указать возвращаемую переменную как статическую. Вы также должны объявить переменную a в main как просто int** (и не указывать размеры).

Функция возвращает указатель на область памяти, содержащую 9 int с. Делая вид, что он содержит указатель на int грубо неправильно и не даст вам ничего, кроме головной боли. — Ниссе Энгстрём

В примере, приведенном OP, проще всего поместить массив в стек. Я не проверял это, но это было бы так.

Да, это не «возвращает» массив с помощью функции возврата, но я полагаю, что это не было целью вопроса. Массив a[][] действительно загружается, и загруженный массив a[][] доступен в main после вызова retArr(), ничего не перезаписывается.

ответ дан 30 апр.

Массив имеет локальную область видимости и уничтожается, как только вы выходите из функции. Это означает, что return a; фактически возвращает висячий указатель.

Чтобы исправить это, поместите массив в глобальную область видимости или используйте malloc() и скопируйте массив в выделенное пространство.

Нужно вернуться int** , Не int .

Неправильно как минимум по двум причинам; тип возвращаемого значения будет int (*)[3] , Не int ** , и массив перестает существовать, когда функция возвращает значение, поэтому значение указателя недействительно. — Джон Боде

Читать:
Sentinel one что это за программа

@JohnBode: int ** не ошибается, просто он менее строго типизирован. (Но возвращать указатель на переменную стека определенно неправильно.) — Кэри Грегори

Ну, вот почему я написал, спрашивая, какую ошибку он получает. Я заметил ошибку компиляции; оставив мой ответ, поскольку он действителен. Я бы также сказал, что лучше иметь дело с указателями, чем с массивами в сигнатурах функций, но я расширю это завтра: Джехлин

Возврат указателя на область памяти, содержащую 9 int и делая вид, что он содержит указатель на int грубо неправильно. — Ниссе Энгстрём

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c arrays function or задайте свой вопрос.

C#. Передача массивов в методы. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода

Передача массивов в методы по значению. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода

В данной теме демонстрируется передача по значению массивов разных типов и размерностей.

Содержание

  • 1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?
  • 2. Пример передачи массива целых ( ulong ) чисел в метод
  • 3. Пример передачи в метод массива чисел типа double
  • 4. Пример передачи одномерного массива структур в метод
  • 5. Пример передачи одномерного массива классов в метод
  • 6. Пример передачи одномерного массива перечислений в метод
  • 7. Пример передачи двумерного массива целых ( int ) чисел в метод
  • 8. Пример передачи двумерного массива классов в метод
  • 9. Пример возврата одномерного массива целых чисел ( int ) из метода
  • 10. Пример возврата двумерного массива типа double из метода
  • 11. Пример возврата двумерного массива классов из метода
  • 12. Пример передачи двумерного ступенчатого массива в метод

Поиск на других ресурсах:

1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?

Общая форма передачи одномерного массива в метод имеет следующий вид:

  • access – модификатор доступа ( public , protected , private );
  • return_type – тип, возвращаемый методом;
  • MethodName – название метода;
  • type – тип массива, который передается в метод;
  • parameterName – название массива, который есть формальным параметром метода MethodName .

2. Пример передачи массива целых ( ulong ) чисел в метод

В примере продемонстрирован метод ReverseArray , который реверсирует массив чисел типа ulong . Метод получает параметром массив items типа ulong .

Использование метода в другом программном коде может быть следующим:

3. Пример передачи в метод массива чисел типа double

Реализован метод, который получает массив чисел типа double в качестве параметра. Метод возвращает сумму элементов массива.

Использование метода в другом программном коде может быть следующим:

4. Пример передачи одномерного массива структур в метод

Задана структура Country , описывающая информацию о стране

Реализация метода MaxPopulation() , определяющего страну, с наибольшим населением. Метод получает массив структур Country .

Демонстрация вызова метода MaxPopulation() из другого программного кода

5. Пример передачи одномерного массива классов в метод

Задан класс Cylinder , реализующий цилиндр

Реализация метода GetMaxVolumeCylinder , получающего массив Cylinders . Метод возвращает порядковый номер элемента массива (цилиндра), который имеет наибольший объем

Использование метода GetMaxVolumeCylinder() в другом методе

6. Пример передачи одномерного массива перечислений в метод

Дана структура DayWeek , определяющая день недели

Ниже реализован метод GetDayOff() , который получает массив типа DayWeek в качестве параметра. Метод определяет количество выходных дней (суббота, воскресенье) в массиве DayWeek .

Демонстрация использования метода GetDayOff() из другого программного кода может быть следующей:

7. Пример передачи двумерного массива целых ( int ) чисел в метод

В примере демонстрируется передача двумерного массива методу Sum() . В качестве параметров метод Sum() получает:

  • двумерный массив целых чисел с именем mn ;
  • количество строк m в массиве;
  • количество столбцов n в массиве.

Метод находит сумму элементов двумерного массива.

Чтобы корректно обращаться к элементам массива, в метод нужно передать количество строк m и столбцов n . Использование метода Sum() в другом программном коде

8. Пример передачи двумерного массива классов в метод

Пусть задан класс, который реализует цвет и прозрачность пиксела на экране. Объявление класса имеет следующий вид

Демонстрируется объявление метода SetArrayColor() , устанавливающего цвет и прозрачность в двумерном массиве классов типа ColorPixel .

Использование метода в другом программном коде может быть следующим

9. Пример возврата одномерного массива целых чисел ( int ) из метода

Демонстрируется метод, который возвращает массив целых чисел ( int[] ). Метод заполняет элементы массива значениями, которые есть квадратами позиций (индексов) массива. Метод получает входным параметром размер массива n .

Вызов метода из другого программного кода может быть следующим

10. Пример возврата двумерного массива типа double из метода

Демонстрируется возврат двумерного массива из метода. Метод GetDoubleArray() получает входным параметром размер массива m*n . Метод возвращает массив.

Использование метода GetDoubleArray() в другом программном коде

11. Пример возврата двумерного массива классов из метода

Пусть задан класс, который реализует символ типа char . В классе есть внутренняя переменная, конструктор и методы, которые определяют принадлежность символа к некоторой категории символов.

Реализация метода GetArrayChar() , который генерирует (возвращает) двумерный массив объектов типа Char

Демонстрация вызова метода GetArrayChar() из другого программного кода

12. Пример передачи двумерного ступенчатого массива в метод

В примере демонстрируется передача в метод и возврат из метода двумерного ступенчатого массива целочисленных величин.

Метод CopyIntArray() получает входными параметрами количество строк m в ступенчатом массиве A и сам ступенчатый массив A . Метод возвращает ступенчатый массив B , который есть копией массива A . Ступенчатый массив B размещается в другой области памяти

Демонстрация использования метода CopyIntArray() для копирования массивов следующая

В результате выполнения вышеприведенного кода, на экран будет выведен следующий результат

Related Posts