2014-03-13 83 views
0

我想讓我的數組創建與boost功能的工作。我寫了下面的代碼,但它不工作。 我該怎麼做,我的數組被我的函數讀取?在此代碼的以前版本中,我只是將其定義爲雙U [N + 1] [4]。它的工作。我在使用boost時做錯了什麼?如何將Boost multi_array傳遞給函數?

#include "boost/multi_array.hpp" 
#include <cassert> 
#include <iostream> 
#include <cmath> 
#include <time.h> 

int const N=400; 
int const x1=0; 
int const x2=1; 
int const gammaValue=1.4; 

void Output(double U[N][3]) 
{ 
    double x,dx; 
    dx=(double(x2-x1))/double(N); 
    FILE *fp; 
    double rho,u,p; 
    fp=fopen("result.dat","w+"); 
    fprintf(fp,"%2.30s\n %20.60s\n %20.18s\t %2.3d\t %2.18s\t ","TITLE = \"1D-EULER.dat \"","variables = \"x\", \"rho\", \"u\", \"p\"","zone i=",N+1,"f=point\n"); 


    for(int n=0;n<N+1;n++) 
    { 
     x=x1+n*dx; 
     rho=U[n][0]; 
     u=U[n][1]/U[n][0]; 
     p=(gammaValue-1)*(U[n][2]-0.5*U[n][0]*u*u); 
     fprintf(fp,"%20.5f\t%20.5f\t%20.5f\t%20.5f\n",x,rho,u,p); 
    } 
    fclose(fp); 
} 

int main() { 
    // 3 x 4 x 2 
    typedef boost::multi_array<double, 2> array_type; 
    typedef array_type::index index; 
    array_type A(boost::extents[N][3]); 

    int values = 0; 
    for(index i = 0; i != N; ++i) { 
     for(index j = 0; j != 3; ++j){ 
      A[i][j] = i+j; 
     } 
    } 

    Output(A); 
    return 0; 
} 

回答

2

使用multi_array的成員函數data(),它返回一個指向包含該數組的數據的連續塊的開始。一旦獲得第一個元素的地址,就可以獲得其他元素,因爲您已經知道數組的維度。

double * p = A.data(); 
    double (*array)[3] = (double (*)[3])p; 
    Output(array); 
+0

你的意思是輸出(A.data()); –

+0

不,你不能,'data()'只返回一個指針。 – jfly

+0

那麼你只需要一個轉換,如我的答案所示。 – jfly

1

爲什麼不只是更改輸出功能的簽名?移動array_type的typedef你的文件的頂部,然後更改輸出功能,以這樣的:

void Output(array_type& U)

或者,更好,使參數const。這裏有一些代碼:

#include <boost/multi_array.hpp>                                                    
#include <iostream>                                                       

typedef boost::multi_array< double, 2 > array_type;                                               

void Output(const array_type& arr)                                                   
{                                                            
    std::cout << "here" << std::endl;                                                   
}                                                            

int main(int argc, char ** argv)                                                    
{                                                            
    array_type arr;                                                       
    Output(arr);                                                        
    return 0;                                                         
} 

這沒有做任何事情,只是證明適當更改函數簽名的原則。

+0

我不確定這是否可行,@RobH,編譯器告訴我有一個斷言失敗, 聲明失敗:(size_type(idx - index_bases [0])

+0

主體 - 更改類型的參數,使數組可以直接傳遞 - 是健全的。編譯器錯誤表明你做錯了,但我擔心。上面我編輯的代碼乾淨地編譯。 – RobH