Как вы возвращаете массив, который имеет несколько значений из функции? C

#c #function

#c #функция

Вопрос:

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

Функция должна выглядеть примерно так:

 int arr[10];
int values[10] = {1,2,3,4,5,6,7,8,9};
for (int i =0; i<10; i  )
{
arr[i] = values[i];
}
  

Как мне перевести этот код в функцию?

использование пространства имен std;

Комментарии:

1. Рассмотрите возможность возврата std::vector вместо массивов.

2. Используйте std::array , а не немые массивы, которые нельзя копировать.

Ответ №1:

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

 #include <iostream>
using namespace std;

void copy_array (const int [], int []); //function prototype

int main()
{
    //Your arrays
    int arr[10];
    int values[10] = {1,2,3,4,5,6,7,8,9};

    //Function call
    copy_array(values, arr);

    //Display contents of array
    for(int i =0; i<10; i  ){
        cout << arr[i] << " " ;
    } 

    return 0;
}

//Function definition
void copy_array (const int values[], int arr[]){
    
    for (int i =0; i<10; i  ){

        arr[i] = values[i];

    } 

}
  

Вывод

 1 2 3 4 5 6 7 8 9 0 
  

Кроме того, размер вашего массива должен быть постоянной целочисленной переменной.

Комментарии:

1. Чем это отличается от другого ответа, который был дан? В любом случае, комментарии, которые я сделал к этому ответу, применимы и к вашему ответу.

2. Я не заметил другого ответа… Наверное, я слишком долго отвечал на lmao … mb

Ответ №2:

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

 #include <iostream>

void assignarray(int *dest, int *src, size_t size)
{
    for (size_t i = 0; i < size;   i)
    {
        dest[i] = src[i];
    }
}

int main()
{

    int arr[10];
    int values[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    assignarray(arr, values, sizeof(values) / sizeof(int));
    for (size_t i = 0; i < 10; i  )
    {
        std::cout << values[i] << " ";
    }
}
  

вывод:

 1 2 3 4 5 6 7 8 9 10
  

Комментарии:

1. Ваш комментарий о том, что это «бесполезные копии», не обязательно соответствует действительности для оптимизирующего компилятора. Но массивы все равно не могут быть возвращены, так что это спорный вопрос. Я бы поспорил, что ваш код может быть не быстрее и, возможно, медленнее, чем using std::array .

2. Результат, который я получил , таков 1 2 3 4 5 6 7 8 9 10 . 4-е число отличается от вашего вывода.

3. да, извините, я скопировал неверный вывод из более ранней версии: D @PaulMcKenzie, если вы можете использовать std::array только в том случае, если у вас есть массивы фиксированного размера и вы знаете их время компиляции. если вы используете метод копирования, вы можете изменить его размер, и если вы знаете размер, вы всегда можете скопировать их: D но да, если вы можете использовать std::array, вы должны это сделать

4. Чтобы изменить размер массива, вы бы использовали std::vector . Одна вещь, которую вы должны понимать — введение указателей не означает «ускорение кода». Слишком многие все еще думают, что использование указателей превзойдет оптимизатор компилятора. Кроме того, комментарий о возврате массива — даже если массивы не могут быть возвращены, этот базовый комментарий неверен в отношении возврата, замедлит код. Компиляторы используют, а в некоторых случаях и обязаны оптимизировать возвращаемое значение, поэтому все те страхи 20-летней давности о возвращении больших объектов, «замедляющих» программу, по большей части, исчезли.

5. И если у вас есть небольшая программа с небольшой функциональностью, зачем вам заключать ее в тяжелый класс std::vector ? — Вот почему я упомянул std::array в первый раз. Во-вторых, объем функциональности не имеет ничего общего с использованием вектора или нет. Если функциональность того, что предоставляет vector, создает чистую программу без ошибок, то ее следует использовать.

Ответ №3:

Возвращаемый тип функции не может быть массивом.

Однако array может быть членом класса, а class может быть типом возвращаемого значения функции, поэтому можно вернуть объект класса, который оборачивает массив. В стандартной библиотеке есть шаблон для такой оболочки массива. Он вызывается std::array .

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

 template<class Range>
void fill(Rangeamp; r) {
    assert(std::ranges::distance(r) == 10);
    int values[10] = {1,2,3,4,5,6,7,8,9};
    int i = 0;
    for (autoamp; e : r)
    {
         e = values[i  ];
    }
}

// example
int arr[10];
fill(arr);