Как передать массив с различными размерами в моей функции C ++? - PullRequest
0 голосов
/ 14 сентября 2018

Я не уверен, возможно ли это, но я открыт для идей.

У меня есть функция c ++. Он выполняет некоторые вычисления для массивов, которые определяются пользователями как входные данные, и генерирует два выходных значения. Давайте назовем это «моя функция», и это будет выглядеть примерно так:

void myfunction (двойной массив1 [18], двойной массив [9], двойной массив [2], двойной * выход1, двойной * выход2)

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

Например,

void myfunction (двойной массив1 [81], двойной массив [27], двойной массив [3], двойной * выход1, двойной * выход2)

Математически «myfunction» может рассчитывать точные выходные данные, несмотря на размер массива. Я не хочу делать дубликат «myfunction», потому что есть всего 5 различных наборов размеров массива, которые пользователь может определить как входные данные.

Есть идеи? заранее спасибо

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы можете либо передать std::vector, либо использовать template:

template <std::size_t N1, std::size_t N2, std::size_t N3> // and so on...
void work_with_arrays(double (&arr1)[N1], double (&arr2)[N2], double (&arr3)[N3]){
    std::cout << "First arr of a size: " << N1 << "\n";
    std::cout << "Second arr of a size: " << N2 << "\n";
    std::cout << "Third arr of a size: " << N3 << "\n";
};

int main() {
    double something[32];
    double fewer[13];
    double maybe_byte[8];

    work_with_arrays(something, fewer, maybe_byte);
}

Код выводится:

First arr of a size: 32
Second arr of a size: 13
Third arr of a size: 8

Объяснение:

Следует знать, что аргумент типа T[] (T - любого типа) распадается до T*.Если мы имеем дело с указателем на массив, у нас нет информации о его длине, что весьма прискорбно, учитывая тот факт, что длины массивов фиксированной длины известны во время компиляции и могут быть видны везде, где мы работаем с ними.

Следует также знать, что шаблон функции является , а не функцией.Это шаблон, используемый для создания функций.Для каждого другого набора N#, использованного в примере выше, для нашего использования будет сгенерирована функция.

Какой обходной путь существует для проблемы распада?

Вместо передачи необработанного T[], мы должны передать ссылку на T[].Таким образом, тип не исчезает, и размер массива будет известен.

Синтаксис?

Можно заметить, что T (&name)[some_size] выглядит как минимум странно.Скобки обязательны, так как обычный T &name[size] будет интерпретирован как T& name[size], который является массивом ссылок , а не ссылкой на массив .

Вывод:

Будучи в состоянии определить размер массива, переданного в качестве аргумента, мы не хотим ограничивать себя одним или двумя случаями - мы хотим покрытьвсе они , поэтому мы используем template для генерации функций с N# необходимого значения.

0 голосов
/ 14 сентября 2018

Ваша функция может принимать vector, который представляет собой «динамически изменяемый размер массива». Вы можете перебрать его или получить его размер по мере необходимости. См. документы .

#include <vector>
using std::vector;  // I'm too lazy to prepend std:: as needed.
void myfunction(const vector<double>& array1, 
                const vector<double>& array2,
                const vector<double>& array3, 
                vector<double>& output1, vector<double>& output2) {

}

Если это невозможно, пусть он принимает дополнительные аргументы, указывающие размер массивов.

void myfunction(double *array1,
                double *array2, 
                double *array3,
                int size1,
                int size2,
                int size3,
                double *output1, 
                double *output2) {

}

но это действительно ужасно. Просто зайдите с первым вариантом.

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