2011-12-15 6 views
0

Я хотел бы передать серию 2D-массивов функции, которая затем сохраняет ее в файл. Моя «функция сбережения» выглядит следующим образом: (вопросительные знаки указывают я не знаю, какого черта я делаю.)Передача 2D-массива функции C++

void saveArray(double* z(?),double* u1(?),double* u2 (?),double* theta (?), int row, 
int column) 
{ 
ofstream output("data.csv"); 
for(int j=0;j<row;++j) 
for(int i=0;i<column;i++) 
{ 
output<<setprecision(32)<<z[j]<<","<<setprecision(32)<<u1[j][i]<<"," 
<<setprecision(32) 
<<u2[j][i] <<","<<setprecision(32)<<theta[j][i]<<endl; 
} 

г является: г [30000], u1, u2 и тета являются [101] [30000] 2D-массивы.

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

+1

Почему у вас есть вопросительные знаки в вашем коде? Используйте '/ * comments * /' вместо – bobobobo

+0

Вам лучше взять какую-нибудь книгу. – Beginner

+0

Ух, ну, и вопрос в том, что? –

ответ

2

Я считаю, что с массивами 2d гораздо проще справляться, рассматривая их как 1d-массивы, по крайней мере, передавая их в качестве параметров.

void saveArray(double* z, double* u1, double* u2, double* theta, int row, int column) 
{ 
    ofstream output("data.csv"); 
    for(int j=0; j<row; ++j) 
     for(int i=0; i<column; i++) 
     { 
      int offset = j * column + i; 
      output <<setprecision(32)<<z[j]<<"," 
        <<setprecision(32)<<u1[offset]<<"," 
        <<setprecision(32)<<u2[offset] <<"," 
        <<setprecision(32)<<theta[offset]<<endl; 
     } 
} 

Когда вы это называете, обязательно разыменовать ваших 2d массивов:

saveArray(z, *u1, *u2, *theta, 101, 30000); 

Вы также могли бы сделать это по-другому, где вы можете передать массивы по ссылке, и вам не нужно пропустите размер. Это будет работать только если у вас есть фактические массивы, а не только указатели на них:

template<size_t R, size_t C> 
void saveArray(double (&z)[C], double (&u1)[R][C], double (&u2)[R][C], double (&theta)[R][C]) 
{ 
    ofstream output("data.csv"); 
    for(int r=0; r<R; ++r) 
     for(int c=0; c<C; ++c) 
     { 
      output <<setprecision(32)<<z[c]<<"," 
        <<setprecision(32)<<u1[r][c]<<"," 
        <<setprecision(32)<<u2[r][c] <<"," 
        <<setprecision(32)<<theta[r][c]<<endl; 
     } 
} 

Тогда вы бы просто назвать его так:

saveArray(z, u1, u2, theta); 
+0

Это на самом деле правильный способ сделать это (ну хотя бы в C :), на C++ вы можете обернуть это классом. Или используйте что-то уже написанное (если ваш проект имеет импульс, а затем boost :: multi_array - лучший вариант). – Kos

+0

Привет, Бенджамин: Спасибо, что помогли мне. Кажется, это работает. –

Смежные вопросы