2010-08-24 5 views
7

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

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

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

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

+4

Почему вам это нужно, как '' двойной **? Что случилось с 'double (*) [4]'? –

+0

Это C++. Может ли это быть класс с этим массивом в качестве члена, который передает ссылку обратно при вызове функции-члена? –

+0

Возможный дубликат [Передача двумерного массива с помощью указателя] (http: // stackoverflow.com/questions/3515045/pass-two-array-array-via-pointer) Это C, а не C++, но это точно такая же проблема. –

ответ

9

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

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); 
} 

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

+0

Я думаю, что этот ответ становится теплее. Это может быть тот, который я ищу! – Felix

+0

Заменив «init» на функцию копирования, эта модель элегантно отображает мою проблему. Благодаря! – Felix

1

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

3

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

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

+0

, так как я не знаю или не понимаю «double (*) [4]», я не могу его набросать. Что это значит? – Felix

+0

@Felix: Это означает «указатель на длину-4 массив двойной». –

5

Все ли ваши матрицы 4x4? Тогда я бы просто определить класс с 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

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

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]) 
{ 
    ... 
    ... 
} 

Это передает массив в качестве ссылки вы нуждающимися заменяется без использования указателя.

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

+0

Спасибо! Эта однострочная инициализация была тем, что я искал. –

0

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

#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; 
} 
Смежные вопросы