Форум программистов, компьютерный форум CyberForum.ru

Передача небольшой матрицы в функцию - C++

Войти
Регистрация
Восстановить пароль
 
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
27.01.2013, 05:33     Передача небольшой матрицы в функцию #1
Если написать такой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int FUNC(const int arg[2][2]){
 printf("\n Matrix:");
 printf("\n\t%d\t%d",arg[0][0],arg[0][1]);
 printf("\n\t%d\t%d",arg[1][0],arg[1][1]);
 return 0;
}
 
int main(){
const int _matr[2][2]={{11,12},{21,22}};
FUNC(_matr); /// Эти две строчки смотрятся криво, и писать лишнюю переменную неудобно, но всё без разговоров работает как надо, функция читает именно эту матрицу, вижу на экране именно то, чего ждал
getch();
return 0;
}
То вызов функции выглядит очень неизяшно, но всё на ура работает.
Но если попробовать лучше и вроде тоже самое, то компилятор посылает!
C++
1
FUNC({{11,12},{21,22}});
Спросил серьезного программиста, он сказал, что так в принципе не может работать, так как расписанный массив создает особый объект, который годен только для создания массива, но не для передачи в функцию. Он предложил написать преобразование в массив интов 2 на 2. И предупредил, что может не всякий компилятор даже так позволит. Кинул строчку пример.
Но строчки (эта буквально по его системе)
FUNC((int[2][2]){{11,12},{21,22}});
и в отчаянной надежде написать чуть надёжней
FUNC((int[2][2])({{11,12},{21,22}}));
тоже не скомпилились. На вторую особенно сильно ругнулось...
У меня сейчас MinGW.

Как можно эту передачу сделать Красиво? Области применения реальные - скажем трехмерное (обобщая - двумерное, четырехмерное, любое Фиксированное и Небольшое) преобразование чего-то. Перекодировка трех цветов... Понятно всё это можно реализовывать по принципу как у меня скомпилилилось, или даже запитывать функцию девятью числами, но как красиво матрицу?

Добавлено через 12 минут
Гм. Заодно спросил друга ещё раз, оказалось он тоже не спит. Он сказал, что может эта вещь из стандарта СИ не вошла в плюсы. Я переделал код на чистый СИ (убрал просто константность) , переименовал на всяк случай файл из cpp в с , и запустил для него gcc а не g++ . И тут же всё скомпилилось и сработало ожидаемо!!!!
Т.е. почему-то (толи увы, толи может есть смысл) эту вещь не пустили в плюсы

Добавлено через 7 минут
Связанные темы посмотрел, но там про другие вещи речь. Там более сложное формально, но именно "на лету" создать матрицу в строке аргументов функции и передать - не просматривается
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 05:33     Передача небольшой матрицы в функцию
Посмотрите здесь:

передача всей матрицы в функцию C++
C++ Передача матрицы в функцию
C++ Передача в функцию копии матрицы
передача матрицы в функцию C++
Передача двухмерного массива из функцию в функцию C++
C++ Передача динамической матрицы в функцию
Передача матрицы в функцию C++
C++ Написать функцию, которая принимает указатель на небольшой 2х мерный массив int значениями
C++ Передача объекта в функцию или функцию друга
C++ Передача в функцию и возврат из функции динамической матрицы
Передача массива в функцию используя указатель на функцию C++
C++ Разработать программу, которая содержит функцию замены местами первого и последнего столбцов матрицы и функцию

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
27.01.2013, 06:42     Передача небольшой матрицы в функцию #2
Чисто технически, как вариант можно использовать возможности 11-го стандарта и написать нечто такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
typedef std::vector<std::vector<int>> Matrix;
 
void f(const Matrix& matrix)
{
    for (const auto& row : matrix)
    {
        for (const auto& item : row)
        {
            std::cout << item << " ";
        }
        std::cout << std::endl;
    }
}
 
int main()
{
    f({{4, 2}, {1, 3}});
    return 0;
}
Но в посте был несколько другой вопрос:
Цитата Сообщение от SeaMonster Посмотреть сообщение
Как можно эту передачу сделать Красиво?
Мое субъективное мнение: самое простое, логичное и ожидаемое - это именно использование переменной. Потому что не должно быть в коде магических чисел. Хочется, чтобы значения по максимуму были связаны с именами, отражающими их смысл. Если же эта переменная мозолит глаза в конкретном месте, ее и вызов функции можно вынести в другую функцию. Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void process(int** in, /* ... */) {
    // обработка матрицы in
}
 
void prepare(/* ... */) {
    int matrix[2][2] = /* ... */;
    process(matrix);
}
 
int main() {
    prepare(/* ... */);
    return 0;
}
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
27.01.2013, 13:18  [ТС]     Передача небольшой матрицы в функцию #3
Всё учту!

_____

Именно того, что я хотел, удалось добиться так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int FUNC(const int arg[2][2]){
 printf("\n Matrix:");
 printf("\n\t%d\t%d",arg[0][0],arg[0][1]);
 printf("\n\t%d\t%d",arg[1][0],arg[1][1]);
 return 0;
}
 
int main(){
const int _matr[2][2]={{11,12},{21,22}};
FUNC(_matr); /// Эти две строчки смотрятся криво, и писать лишнюю переменную неудобно, но всё без разговоров работает как надо, функция читает именно эту матрицу, вижу на экране именно то, чего ждал
FUNC((const int[2][2]){{1,3},{0,8}}); /// вот оказывается что мне хотевшееся компилятор принимает!!!!! Сразу КОНСТАНТНОЕ если функция принимает Константное
getch();
return 0;
}
Т.е. собственно вся разница - надо записывать FUNC((const int[2][2]){{1,3},{0,8}}); То есть почему-то на моём компиляторе - на лету написанную матрицу превратить в переменную Можно, но - раз функция принимает константное, то надо сразу явно преобразовать не только в матрицу, а в константную матрицу, сам он этого не сделает!
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
27.01.2013, 21:25     Передача небольшой матрицы в функцию #4
Принимай ссылку на массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<cstdio>
 
using namespace std;
 
int FUNC(int const (&arg)[2][2]) {
   printf("\n Matrix:");
   printf("\n\t%d\t%d",arg[0][0],arg[0][1]);
   printf("\n\t%d\t%d",arg[1][0],arg[1][1]);
   return 0;
}
 
int main(){
   FUNC({{1, 3}, {0, 8}});
}
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
27.01.2013, 21:45  [ТС]     Передача небольшой матрицы в функцию #5
Отлично! Ты дал вариант, как совсем прямо инициализацию передавать. Проверил - по крайней мере на моём MinGW он пошёл!!!
Yandex
Объявления
27.01.2013, 21:45     Передача небольшой матрицы в функцию
Ответ Создать тему
Опции темы

Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru