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

Передача двумерного массива в функцию - C++

Восстановить пароль Регистрация
 
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
09.10.2012, 22:05     Передача двумерного массива в функцию #1
Неожиданно для себя столкнулся с такой вот проблемой . Есть две функции :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void print_matrix(double ** A, int n) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << A[i][j] << "\t";
        }
        cout << endl;
    }
}
void print_vector(double * x, int n) {
    for (int i = 0; i < n; ++i) {
        cout << x[i] << endl;
    }
}
Но при вызове работает только вторая функция (первая вызывает ошибку):
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
    double A[4][4] = {{0.11, -0.17, 0.72, -0.34,}, 
                    {0.81, 0.12, -0.91, 0.17}, 
                    {0.17, -0.18, 1.00, 0.28}, 
                    {0.13, 0.17, -0.99, 0.35}};
    double b[4] = {0.17, 1.00, 0.21, 2.71};
    //print_matrix(A,4);
    print_vector(b,4);
    system("pause");
    return 0;
}
Печатать матрицу программа не хочет , выдает ошибку о том , что не может перевести переменную к типу double ** . Довольно странно , учитывая то , что с одномерным массивом проблем нет . Что делать ? (изменять сигнатуру функции я не хочу ,ибо так она записана в более общем виде) .
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
09.10.2012, 22:21     Передача двумерного массива в функцию #2
Цитата Сообщение от dota Посмотреть сообщение
выдает ошибку о том , что не может перевести переменную к типу double ** . Довольно странно , учитывая то , что с одномерным массивом проблем нет . Что делать ?
Ничего странного, если учитывать такую вещь: в функцию передаётся не массив, а указатель на его первый элемент, поэтому и работает ваш вариант с одномерным массивом. В случае с двумерным массивом всё чуть сложнее - в функцию опять-таки передаётся указатель на первый элемент массива, но теперь это не просто массив, а массив массивов, поэтому параметр функции - указатель на массив. А у вас - указатель на указатель на double.
Передать двумерный массив в функцию можно так:
C++
1
2
void func(double arr[100][500]);
void func(double (*arr)[500]);
Добавлено через 1 минуту
Ну или опустить число в квадратных скобках.

Добавлено через 2 минуты
Цитата Сообщение от dota Посмотреть сообщение
изменять сигнатуру функции я не хочу ,ибо так она записана в более общем виде
В наиболее общем виде это будет так:
C++
1
2
template <typename T, int N, int M>
void func(T (&arr)[N][M]);
И кстати, при таком подходе функции известен размер массива, что полезно. Правда, такой вариант не все старые компиляторы поддерживают (MSVS 6.0 не поддерживает, например).
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
09.10.2012, 22:45     Передача двумерного массива в функцию #3
посмотри здесь Передача двумерного массива в функцию
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
09.10.2012, 23:31  [ТС]     Передача двумерного массива в функцию #4
Если опустить число в квадратных скобках , то не работает ( А размер матрицы заранее не задан .
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
10.10.2012, 00:39     Передача двумерного массива в функцию #5
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
#include <iostream>
 
template<typename T>
void Print(T* p, size_t c, size_t r = 1)
{
    for(size_t i = 0; i < r; ++i)
    {
        for(size_t j = 0; j < c; ++j)
        {
            std::cout << p[j + c * i] << "  ";
        }
        std::cout << std::endl;
    }
}
 
int main()
{
    size_t const col = 3;
    double mx[][col] = {{1.1, 2.2, 3.3}, {4.1, 5.2, 6.3}};
    short arr[] = {11, 22, 33, 44, 55, 66};
    std::cout << "array:\n";
    Print(arr, sizeof(arr) / sizeof(*arr));
    std::cout << "\nmatrix:\n";
    Print(*mx, col, sizeof(mx) / sizeof(*mx));
    return 0;
}
Yandex
Объявления
10.10.2012, 00:39     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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