0

私はこれをクラスにしたいと思います:

class block {
public:
int NX,NY;

int A[][]; // I want the the dimension of A is from 1 to NX and 1 to NY, how do I do that?
};

実際、私はすでに対応するFORTRANコードを持っています.C ++でそれを持ちたいです.コンストラクタを適切に使用すると、FORTRANのようにオブジェクトの各コンポーネントをコピーするのではなく、オブジェクトを簡単に作成してコピーできると思います. やり方教えてください!ありがとう!

module LinearSolution
    type LAE
        integer::N
        double precision,dimension(:,:),allocatable::A
        double precision,dimension(  :),allocatable::B
    contains
        procedure,nopass::RowReduction
    end type LAE
contains
    subroutine RowReduction
        double precision::C
        do k=1,N
            do i=k+1,N
                if(A(k,k)/=0) then
                    C=A(i,k)/A(k,k)
                    B(i)=B(i)-B(k)*C       !error: Statement Function is recursive
                    do j=k+1,N
                        A(i,j)=A(i,j)-A(k,j)*C   !error: Statement Function is recursive
                    end do
                end if
            end do
        end do

        do k=N,1,-1
            do i=k-1,1,-1
                if(A(k,k)/=0) then
                    C=A(i,k)/A(k,k)
                    B(i)=B(i)-B(k)*C  !error: Statement Function is recursive
                end if
            end do
        end do

        do k=1,N
            if(A(k,k)/=0) then
                B(k)=B(k)/A(k,k)  !error: Statement Function is recursive
            end if
        end do
    end subroutine RowReduction
end module LinearSolution

program TestLAE
    use LinearSolution  !fatal error: cant open module file LinearSolution.mod for reading
    type(LAE)::LAE1
    LAE1%N=3
    allocate(LAE1%B(1:N))
    allocate(LAE1%A(1:N,1:N))
    LAE1%B=(/1,1,1/)
    LAE1%A=(/2,0,0,0,2,0,0,0,2/)
    call LAE1%RowReduction
    print*, LAE1%B(1),LAE1%B(2),LAE1%B(3)
end program
4

2 に答える 2

1

コンストラクターはあなたが望むものですか?

class block {
public:
    int NX, NY;
    int **A;
    block(int nx, int ny){
        NX = nx;
        NY = ny;
        A = new int*[NX + 1];
        for(int x = 1; x <= NX; x++)
            A[x] = new int[NY + 1];
    }
    ~block(){
        for(int x = 1; x <= NX; x++)
            delete A[x];
        delete A;
    }
};
于 2013-05-02T13:48:32.090 に答える
0

あなたが求めていることは、標準の C++ では不可能です。C++ では、任意の配列のサイズに定数でインデックスを付ける必要があります。次の構文を使用しても、エラーが発生します。

const int NX=10;
const int NY=10;
int A[NX][NY];

1つの可能性は、

#define NX 10
#define NY 10
int A[NX][NY]; 
于 2013-05-02T13:50:29.860 に答える