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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
#1

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

27.01.2013, 05:33. Просмотров 400. Ответов 4
Метки нет (Все метки)

Если написать такой пример
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 минут
Связанные темы посмотрел, но там про другие вещи речь. Там более сложное формально, но именно "на лету" создать матрицу в строке аргументов функции и передать - не просматривается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 05:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача небольшой матрицы в функцию (C++):

передача матрицы в функцию - C++
всем привет! пишу программу,которая просто в классе суммирует матрицу (пусть для простоты 3*3) но--не могу никак сделать такую вещь--в...

Передача матрицы в функцию - C++
Доброго времени суток. Возникло несколько вопросов: Почему при вызове Matrix1 выдаётся ошибка, но в то же время Matrix2 работает...

Передача матрицы в функцию - C++
Всем здравствуйте, не совсем понимаю концепцию объявления идентификатора trans, объясните, пожалуйста, как нужно его объявить? ...

Передача динамической матрицы в функцию - C++
Здравствуйте подскажите пожалуйста, как можно передать динамическую матрицу, заданную и инициализированную следующим образом ...

передача всей матрицы в функцию - C++
как передать всю матрицу в функцию? функция ничего не возвращает, я только печатает матрицу

Передача в функцию копии матрицы - C++
1) Я создаю массив указателей(матрицу) на char. char** mapInChar. 2) Выделяю память в зависимости от размеров нужных мне. ...

4
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
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;
}
1
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}}); То есть почему-то на моём компиляторе - на лету написанную матрицу превратить в переменную Можно, но - раз функция принимает константное, то надо сразу явно преобразовать не только в матрицу, а в константную матрицу, сам он этого не сделает!
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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}});
}
1
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
27.01.2013, 21:45  [ТС] #5
Отлично! Ты дал вариант, как совсем прямо инициализацию передавать. Проверил - по крайней мере на моём MinGW он пошёл!!!
0
27.01.2013, 21:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 21:45
Привет! Вот еще темы с ответами:

Передача в функцию и возврат из функции динамической матрицы - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; const int n = 8; double ** f (double ** mas, int n) { ...

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

Передача объекта в функцию или функцию друга - C++
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include &lt;iostream&gt; using namespace std; class My_Class1 { ...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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