Функция, возвращающая адрес массива вместо его значений - PullRequest
0 голосов
/ 03 ноября 2019
int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    return new_array;

}



void main() {
    int y[] = { 1,2,100,18,20,94 };
    cout<< filtrationBiggerValues(y, 6, 8)<<"\n";

}

Я должен увидеть новый массив со значениями, превышающими определенное значение, но вместо этого я получу его адрес.

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

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

int* filtrationBiggerValues(int* values, int nrValues, int givenValue, int& outputSize) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    outputSize = j;
    return new_array;

}

void main() 
{
    int y[] = { 1,2,100,18,20,94 };
    int outputSize = 0;

    int* output = filtrationBiggerValues(y, 6, 8, outputSize);
    for(int i=0; i<outputSize; ++i)
    {
        cout<< output[i] <<"\n";
    }
}

Обновление (если вы хотите сохранить сигнатуру функции как есть)

int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    new_array[j] = 0;
    return new_array;

}

void main() 
{
    int y[] = { 1,2,100,18,20,94 };

    int* output = filtrationBiggerValues(y, 6, 8);
    for(int i=0; output[i]>0; ++i)
    {
        cout<< output[i] <<"\n";
    }
}
0 голосов
/ 03 ноября 2019

Столько всего сказать:

int* new_array = NULL; C ++ использует nullptr. Т.е. int* new_array = nullptr;

Тем не менее, вы должны вставить инициализацию, которую делаете в следующей строке:

int* new_array = new int[nrValues];

Но вы только что создали новый объект в куче, который вы не delete,Это называется утечкой памяти. В настоящее время мы используем уникальные указатели, чтобы помочь нам в этом.

std::unique_ptr<int[]> new_array = new int[nrValues];

Однако в C ++ у нас есть контейнеры STL, которые обрабатывают все вещи массива в стиле C для вас. Поскольку new_array отличается от values, вы, вероятно, захотите использовать std::vector, который имеет динамический размер. Контейнеры STL имеют нечто, называемое iterators, которое может более эффективно проходить через элемент. Однако контейнеры STL не имеют функций вывода по умолчанию, поэтому вам придется написать свои собственные.

#include<vector>
#include<iostream>

std::vector<int> getBiggerThen(std::vector<int> const& input, int givenValue) {
    std::vector<int> output;

    for (auto it = input.cbegin(); it != input.cend(); it++) {
        if (*it > givenValue) {
            output.push_back(*it);
        }
    }
    return output;
}

std::ostream& operator<< (std::ostream& out, std::vector<int> const& vec) {
    for (auto const& el : vec) out << el << " ";
    return out;
}

int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::cout << getBiggerThen(y, 8) << "\n";
}

о ... также важно: в C ++ main всегда должно возвращаться int.

Наконец, то, что вы делаете, требуется так часто, что библиотека STL имеет встроенный алгоритм для этого. Который может уменьшить все до

#include<vector>
#include<algorithm>
#include<iostream>

int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::vector<int> output{};
    int givenValue = 8;
    std::copy_if(std::cbegin(y), std::cend(y), std::back_inserter(output),
        [givenValue](int val) { return val >= givenValue; });
    for (auto const& el : output) std::cout << el << " ";
    std::cout << "\n";
}
0 голосов
/ 03 ноября 2019

имя массива на самом деле является указателем. если вы попробуете это:

  int main() 
   {
        int y[] = { 1,2,100,18,20,94 };
        cout << y <<endl;
        cout<< filtrationBiggerValues(y, 6, 8)<<"\n";
        return 0;
    }

на выходе будет два адреса

0x7ffd7ac2bc10
0xfadc30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...