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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
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
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!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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}});
}
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++
Разработать программу, которая содержит функцию замены местами первого и последнего столбцов матрицы и функцию,которая, первый...

Передача в функцию - C++
вот есть такие строки кода: typedef vector&lt; vector&lt;char&gt; &gt; string_sound; void sound_func(string_sound &amp;text_sound, int sum_words)...

Передача в функцию - C++
компилятор ругается на int sumcolumn (int **a, int n) sumcolumn(a,m) почему не могу передать массив i*1, таким образом? ...

Передача массива в функцию - C++
Добрый день, мне нужно посчитать кол-во счастливых билетов на определенном промежутке. Используя для этого разные функции. Но проблема в...


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

Или воспользуйтесь поиском по форуму:
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
27.01.2013, 21:45  [ТС]     Передача небольшой матрицы в функцию #5
Отлично! Ты дал вариант, как совсем прямо инициализацию передавать. Проверил - по крайней мере на моём MinGW он пошёл!!!
Yandex
Объявления
27.01.2013, 21:45     Передача небольшой матрицы в функцию
Ответ Создать тему
Опции темы

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