Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 02.12.2013
Сообщений: 37

Возврат массива типа array из функции

21.06.2020, 10:31. Показов 1367. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю метод, компилятор пишет не соответствие списков аргументов.
Подскажите где в действительности ошибка.
C++
1
2
template<typename T, size_t r1, size_t c1, size_t r2, size_t c2, size_t r3, size_t c3>
static array<array<T, c3>, r3> matrices_mutltiplication(array<array<T, c1>, r1> &x, array<array<T, c2>, r2> &y);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template<typename T, size_t r1, size_t c1, size_t r2, size_t c2, size_t r3, size_t c3>
inline array<array<T, c3>, r3> ArraysStaticStdLibrary::matrices_mutltiplication(array<array<T, c1>, r1>& x, array<array<T, c2>, r2>& y)
    {
        //size_t r3 = r1, c3 = c2;
        array<array<T, c3>, r3> multy;
 
        // dimension check
        if (r1 == 0 || c1 == 0 || r2 == 0 || c2 == 0) throw MyException("one of the dimentions of incoming matrices is 0");
        if (c1 != r2) throw MyException("the number of columns in the first matrix is not equal the number of rows in the second matrix");
        //// Next requirements are always true, cause there is initialization vector multy
        //if (rows_x != rows_multy) throw MyException("the number of rows in the first matrix is not equal the number of rows in the result matrix");
        //if (cols_y != cols_multy) throw MyException("the number of columns in the second matrix is not equal the number of columns in the result matrix");
 
 
        T sum = 0;
 
        for (size_t i = 0; i < r1; i++) {
            for (size_t j = 0; j < c2; j++) {
                for (size_t k = 0; k < c1; k++)
                    sum += x[i][k] * y[k][j];
                multy[i][j] = sum;
                sum = 0;
            }
        }
 
        return multy;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // Initialization
    const size_t rows1 = 3, cols1 = 3;
    const size_t rows2 = 3, cols2 = 3;
    const size_t rows3 = 3, cols3 = 3;
 
    array < array <int, cols1>, rows1> a1;
    array < array <int, cols2>, rows2> a2;
    array < array <int, cols3>, rows3> a3;
 
    // Filling
    ArraysStaticStdLibrary::filling_array_2D(a1, 0, 1);
    ArraysStaticStdLibrary::filling_array_2D(a2, 0, 1);
 
    // Operation
    a3 = ArraysStaticStdLibrary::matrices_mutltiplication(a1, a2);
ошибки:
Ошибка (активно)отсутствуют экземпляры шаблон функции "my_library::ArraysStaticStdLibrary::mat rices_mutltiplication", соответствующие списку аргументов
Ошибка C2783 std::array<std::array<T,c3>,r3> my_library::ArraysStaticStdLibrary::matr ices_mutltiplication(std::array<std::arr ay<T,c1>,r1> &,std::array<std::array<T,c2>,r2> &): не удается составить аргумент шаблон для "r3"
Ошибка C2783 std::array<std::array<T,c3>,r3> my_library::ArraysStaticStdLibrary::matr ices_mutltiplication(std::array<std::arr ay<T,c1>,r1> &,std::array<std::array<T,c2>,r2> &): не удается составить аргумент шаблон для "c3"
Ошибка C2672 "my_library::ArraysStaticStdLibrary::mat rices_mutltiplication": не найдена соответствующая перегруженная функция
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2020, 10:31
Ответы с готовыми решениями:

Возврат символа из функции типа double
Код работает, при вводе 1 7 1 2 5 0 выдаст первые пять чисел 69. Я понимаю, что из-за типа функции значение char = 'е' переводится по...

Ошибка при заполнении массива типа Array
Всем привет) Не подскажете из-за чего ошибка: System.InvalidCastException: &quot;Невозможно сохранить объект в массиве этого типа.&quot;? ...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

11
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,263
21.06.2020, 10:42
Цитата Сообщение от brddrdtt Посмотреть сообщение
Ошибка C2783 std::array<std::array<T,c3>,r3> my_library::ArraysStaticStdLibrary::matr ices_mutltiplication (std::array<std::array<T,c1>,r1> &,std::array<std::array<T,c2>,r2> &): не удается составить аргумент шаблон для "r3"
Так вам же ясно написали: не удается дедуцировать r3c3). Каким по-вашему образом компилятор сможет определить, чему должно быть равно r3 в вашем вызове?

Возникает вопрос: а почему у вас вообще r3 и c3 являются свободными параметрами шаблона, в том время как очевидно, что эти значения однозначно определяются через r1, c1, r2 и с2?

Более того, значения c1 и r2 тоже не "свободны", а жестко связаны между собой. Зачем было делать их свободными, а затем заниматься сравнениями и разбрасыванием исключений, если можно было сразу потребовать их равенства на уровне объявления шаблона?
0
0 / 0 / 1
Регистрация: 02.12.2013
Сообщений: 37
21.06.2020, 10:56  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так вам же ясно написали: не удается дедуцировать r3 (и c3). Каким по-вашему образом компилятор сможет определить, чему должно быть равно r3 в вашем вызове?
Что такое дедуцировать? Как правильно поступить в таком случае - отправить r3 и c3 в параметры функции?
Но при задании возвращаемого типа функции как двумерного массива array нужно прописывать размер этого массива. Как это сделать без использования r3 и c3?
Это вообще возможно?
Как создать функцию с возвращаемым типом array?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Возникает вопрос: а почему у вас вообще r3 и c3 являются свободными параметрами шаблона, в том время как очевидно, что эти значения однозначно определяются через r1, c1, r2 и с2?
Более того, значения c1 и r2 тоже не "свободны", а жестко связаны между собой. Зачем было делать их свободными, а затем заниматься сравнениями и разбрасыванием исключений, если можно было сразу потребовать их равенства на уровне объявления шаблона?
Да, Вы, действительно, профессионал в математике, но мне это сейчас не важно. Мне важно понять как это программировать без ошибок компилятора.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2020, 11:45
brddrdtt, вам говорят о чем то вроде этого
C++
1
2
3
4
5
template<class T, size_t m, size_t n>
using matrix = std::array<std::array<T, n>, m>;
 
template<class T, size_t m, size_t n, size_t k>
matrix<T, m, n> multiply(const matrix<T, m, k>& lh, const matrix<T, k, n>& rh);
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.06.2020, 11:52
Цитата Сообщение от brddrdtt Посмотреть сообщение
Создаю метод, компилятор пишет не соответствие списков аргументов.
Подскажите где в действительности ошибка.
Основная ошибка - использовать здесь std::array
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,263
21.06.2020, 11:57
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Основная ошибка - использовать здесь std::array
Хотя реализацию можно было бы и абстрагировать от конкретного типа массива, все равно не вижу тут никакой ошибки в использовании std::array.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2020, 12:08
Тут стоит понимать что фактически с такой матрицей не многое можно сделать так как размеры задаются на этапе компиляции а это ограничивает применение. Кроме того избыточность как бы зачем std::array если можем обойтись обычным массивом нет никакого преимущества особенное если хочется перегрузить операторы.

В книге Страуструпа как я помню был пример с valarray он почему то писал что с ним операции выполняются быстрее.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,263
21.06.2020, 12:14
Цитата Сообщение от Avazart Посмотреть сообщение
Тут стоит понимать что фактически с такой матрицей не многое можно сделать так как размеры задаются на этапе компиляции а это ограничивает применение.
Зависит от области применения. В вычислительной геометрии, машинной графике и т.п. операции с матрицами фиксированного (на стадии компиляции) размера - вполне естественное и обыденное явление.

Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того избыточность как бы зачем std::array если можем обойтись обычным массивом нет никакого преимущества.
Преимущество есть: копируемость (кстати, используется в данном коде), унифицированность интерфейса с контейнерами (хотя последнего можно достичь и другими методами). Вообще современные рекомендации однозначно говорят: везде, где вы хотели бы использовать обычный массив, лучше используйте std::array.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2020, 12:22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Зависит от области применения. В вычислительной геометрии, машинной графике и т.п. операции с матрицами фиксированного (на стадии компиляции) размера - вполне естественное и обыденное явление.
Ну от применения всегда все зависит. Например каков будет размер матрицы? Может он будет такой что в стек не влезет. Опять же как это будет влазить в кеши.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Преимущество есть: копируемость (кстати, используется в данном коде), унифицированность интерфейса с контейнерами (хотя последнего можно достичь и другими методами). Вообще современные рекомендации однозначно говорят: везде, где вы хотели бы использовать обычный массив, лучше используйте std::array.
Как по мне унификация с контейнерами заведомо провальная идея, т.е. нет смысла унифицировать если алгоритмы нельзя применить.
0
0 / 0 / 1
Регистрация: 02.12.2013
Сообщений: 37
24.06.2020, 20:29  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
brddrdtt, вам говорят о чем то вроде этого
C++
1
2
3
4
5
template<class T, size_t m, size_t n>
using matrix = std::array<std::array<T, n>, m>;
 
template<class T, size_t m, size_t n, size_t k>
matrix<T, m, n> multiply(const matrix<T, m, k>& lh, const matrix<T, k, n>& rh);
стоп-подождите
в таком варианте всё работает. спасибо
Но. Как сделать так, чтобы передавать в возвращаемый тип свой размер массива - именно r3 и c3?
В этой задаче компилятор смог осознать, что размерность будет m и n. даже без объявления matrix. но если будет другая задача, где потребуется возвращать массив своей размерности?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,263
24.06.2020, 20:38
Лучший ответ Сообщение было отмечено brddrdtt как решение

Решение

Цитата Сообщение от brddrdtt Посмотреть сообщение
но если будет другая задача, где потребуется возвращать массив своей размерности?
Это как это? Размер произведения двух матриц однозначно определяется размерами перемножаемых матриц. Как и куда вы тут собрались прикручивать "свой размер"?

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

Например если вы сделаете так

C++
1
2
template<class T, size_t m, size_t n, size_t k, size_t r3, size_t c3>
matrix<T, r3, c3> multiply(const matrix<T, m, k>& lh, const matrix<T, k, n>& rh);
то при вызове такой шаблонной функции вам придется вручную перечислять все шаблонные аргументы

C++
1
2
matrix<int, 100, 100> c;
c = multiply<int, 10, 5, 8, 100, 100>(a, b);
Это, понятное дело, криво.

Можно вынести r3 и c3 в начало списка параметров

C++
1
2
template<size_t r3, size_t c3, class T, size_t m, size_t n, size_t k>
matrix<T, r3, c3> multiply(const matrix<T, m, k>& lh, const matrix<T, k, n>& rh);
тогда при вызове вам достаточно будет указать только их, а остальные параметры будут дедуцированы автоматически

C++
1
2
matrix<int, 100, 100> c;
c = multiply<100, 100>(a, b);
Но все это - довольно криво...
1
0 / 0 / 1
Регистрация: 02.12.2013
Сообщений: 37
24.06.2020, 21:58  [ТС]
всё встало на свои места и работает. спасибо.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это как это? Размер произведения двух матриц однозначно определяется размерами перемножаемых матриц. Как и куда вы тут собрались прикручивать "свой размер"?
Для какой-то другой задачи, не про перемножение матриц.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но все это - довольно криво...
А как правильно?

И ещё один вопрос. Вот при таком способе возврата массива - он возвращается с помощью копирования всех вычисленных в методе значений в область памяти, которая была заранее задана
C++
1
matrix<int, 100, 100> c;
или по ссылке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2020, 21:58
Помогаю со студенческими работами здесь

Использование элементов массива через синтаксис типа: $array[$i]{0}
Добрый вечер. Сейчас занимаюсь задачками на w3school, которые связаны с массивами и если одни примеры я мог решить сам, а другие нужно...

Возврат массива из функции
Привет! Мне нужно, чтобы под программа задавала значения массива. А что-то странно получается program matrix integer str1, stlb1,...

Возврат массива из функции
Здравствуйте, Не пойму почему не работает данный код. Пишет cannot convert 'std::string*' to 'int*' in return По теории я жду...

Возврат массива из функции
В объекте есть массив int state;, который мне нужно из него вытащить. Вижуал показывал ошибку, когда я пытался вернуть указатель state в...

Возврат массива из функции
Всем привет! Кто подскажет - можно ли в Паскале: 1. в функцию передавать массив? 2. из функции возвращать массив? Я попробовал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru