@DartNyan

Как вернуть массив?

Привет.
Пишу функцию, которая принимает массив, ищет минимальные элементы на четных строках и размещает их в вектор. Т.е. "размещение" должно проходить в ф-ии и этот вектор нужно вернуть.

Проблема (как мне кажется) при попытке вернуть массив.
Хочу сделать двумя способами. Первый с помощью передачи адреса массива (в ф-ю передаю массив, который обрабатываю и массив с результатом, возвращаю адрес массива с результатом, так же можно?), второй способ с выделением памяти. Уже потом.

spoiler
#include <stdio.h>
#include <stdlib.h>
#define n 3 //Столбцы
#define m 4 //Строки

int main()
{
    //Функция, которая находит минимальные элементы массива на четных сроках и размещает их в вектор
    int array[m][n] = {{3,9,2}, // +
                       {3,2,1},
                       {5,1,2}, // +
                       {4,2,6}};
    int minArr[m/2]; // Вектор для вывода размера m/2

    int search_min_elements_of_array(int array[][3], int *minArr);
    {

    int k = 0;          // Переменная, которая увеличивается на четных строках

    for (int j = 0; j < m; j++)                   // Перебор строк

            if (j % 2 == 0) {                     // Если строка четная
                int min = array[j][0];
                for (int i = 1; i < m - 1; i++) { // Перебор элементов строки
                    if (min > array[j][i])
                        min = array[j][i];
                        minArr[k] = min;
                }
                k++;
            };

    return *minArr; // Как вернуть массив?
    } // End of function

    int minArray[m/2] = search_min_element_of_array(int array[][3], int *minArr);
    for (int k = 0; k < m/2; k++)
        printf(" %i", minArray[k]);


}

  • Вопрос задан
  • 3723 просмотра
Решения вопроса 1
Зачем вам его возвращать?
В Си++ нельзя передать массив по значению (только если он не составная часть структуры), вместо этого передают указатель на первый элемент массива, как у вас. Соответственно, все изменения, который вы проводите над int * minArr внутри search_min_elements_of_array отражаются на массиве int minArr[m/2], и отдельно что-то возвращать не надо.

Также стоит перенести определение (тело) функции search_min_elements_of_array за пределы (перед) main, ну и вызов у вас неверный:
// int minArray[m/2] = search_min_element_of_array(int array[][3], int *minArr); // больше похоже на объявление функции
search_min_element_of_array(array, minArr);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Не вижу в вашем коде С++, написано на Си. Если вам нужно вернуть массив из функции в С++:
auto search_min_elements_of_array(/*in*/) -> std::vector<int>
{
    std::vector<int> ret;
    //...
    return ret;
}
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
int search_min_elements_of_array(int array[][3], int *minArr);

и далее идущее тело "вложенной функции", а ещё дальше её вызов -- это круто (:
Ответ написан
@abcd0x00
Пример передачи указателя в функцию и его возврата из функции
Код
#include <stdio.h>

int *func(int a, int b, int *p)
{
    p[0] = a;
    p[1] = b;
    return p;
}

int main(void)
{
    int arr[4], *p;

    p = func(1, 2, arr);
    printf("%d %d\n", p[0], p[1]);

    p = func(3, 4, arr + 2);
    printf("%d %d\n", p[0], p[1]);

    p = arr;
    printf("%d %d %d %d\n", p[0], p[1], p[2], p[3]);
    return 0;
}


Вывод
[guest@localhost c]$ .ansi t.c -o t
[guest@localhost c]$ ./t
1 2
3 4
1 2 3 4
[guest@localhost c]$


Как раз в твоей ситуации у тебя недопонимание указателей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы