C ++ инициализация многомерного массива - PullRequest
7 голосов
/ 24 августа 2010

в C ++ Я хочу инициализировать двойную матрицу (2-мерный двойной массив), как обычно, без указателей, например:

    double data[4][4] = {
    1,0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
};

Однако, поскольку я хочу вернуть и передать его функциям, он мне нужен как указатель double**. Итак, в основном мне нужно хорошо инициализировать данные (как описано выше), но затем мне нужно сохранить указатель на 2D-массив без потери данных при выходе из функции.

Любая помощь в этом? : -)

Ответы [ 6 ]

9 голосов
/ 24 августа 2010

Если вы не особенно разбираетесь в указателях, я бы предпочел ссылку здесь

void init( double (&r)[4][4]){
    // do assignment
    r[0][0] = 1;
}

int main(){
    double data[4][4] = {
        1,0,0,0,
        0,1,0,0,
        0,0,1,0,
        0,0,0,1
    };

    init(data);
}

Кстати, если вы передадите его функции таким образом, вы бы скорее "присваивали", чем "инициализировали"».

5 голосов
/ 24 августа 2010

Все ваши матрицы 4х4? Тогда я просто определил бы класс с double[4][4] членом и передал бы объекты этого класса:

class Matrix
{
    double m[4][4];
    // ...
};

void function(const Matrix& matrix)
{
    // ...
}

Если вам нужны матрицы разных размеров, но они известны во время компиляции, используйте шаблон:

template <size_t n>
class Matrix
{
    double m[n][n];
    // ...
};

template <size_t n>
void function(const Matrix<n,n>& matrix)
{
    // ...
}

Это избавляет вас от распада массива в указатель и делает код более читабельным ИМХО.

4 голосов
/ 24 августа 2010

Во-первых, объявление двумерного массива неверно. Это нужно сделать следующим образом:

double data[4][4] = {  
        {1.0,0,0,0},  
        {0,1,0,0},  
        {0,0,1,0},  
        {0,0,0,1}  
    };

Во-вторых, для передачи в функцию вы можете сделать это как

show(data);

В объявлении функции необходимо указать аргумент в виде массива с указанием всех измерений, кроме первого. Таким образом, объявление будет выглядеть так:

void show(double arr[][4])
{
   ...
   ...
}

Это передает массив как ссылку без необходимости использовать указатель.

Надеюсь, это помогло.

3 голосов
/ 24 августа 2010

double (*)[4] очень отличается от double **

Просто нарисуйте расположение ваших двойников в памяти для обоих, и вы должны понять, почему вы не можете использовать их взаимозаменяемо.

1 голос
/ 24 августа 2010

Инициализируйте временную переменную таким образом, а затем скопируйте ее в динамически выделенную память.

0 голосов
/ 13 января 2013

Как насчет этого (с указателями, и делает то, что вы просили)

#include <iostream>

using namespace std;

int refer(double (*a)[4])
{
   cout<<"First value is "<<(*a)[0];
   (*a)[0] = 37;
   cout<<"changed value is "<<(*a)[0];
}

int main()
{
   double data[4][4] = {
    1.0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
   };
   refer(data);
   return 0;
}
...