0

このメソッド (Matrix::WriteToArray(double &CopyOfArray)) を使用して、Matrix オブジェクト内の配列のコピーを double の配列 (つまり CopyOfArray) に書き込みます。私はコンパイルに問題があります。

どんな助けでも大歓迎です。ありがとう

エラー:

$ make
g++ -g -Wall -c main.cpp
main.cpp: In function ‘int mrstart(double, double*, Matrix&, Matrix&)’:
main.cpp:459:13: error: ‘cff’ declared as reference but not initialized
main.cpp:465:45: error: invalid type argument of unary ‘*’
main.cpp:467:73: error: invalid type argument of unary ‘*’
main.cpp:470:77: error: invalid type argument of unary ‘*’
Makefile:20: recipe for target `main.o' failed
make: *** [main.o] Error 1

サポート ファイルは次のとおりです。 Main.cpp

int mrstart(double hcen, double mr[],  Matrix &a,  Matrix &HT)
{
    double *cff;
    a.WriteToArray(&cff);
    /*...*/
}

マトリックス.cc

int Matrix::WriteToArray(double &CopyOfArray){
    int i;
    for(i=0;i<n_rows;i++){
        CopyOfArray[i]=array[i*n_cols];
        i++;
    }
    return *CopyOfArray;
}

マトリックス.hh

#ifndef MATRIX_H
#define MATRIX_H
// Matrix class of variable size
class Matrix {

private:
    int n_rows;
    int n_cols;
    double *array;

public:
    // Constructors
    Matrix(); // default constructor
    Matrix(int rows, int cols); // two-argument constructor
//  Matrix(const Matrix &arr); // copy constructor


    // Destructor
    ~Matrix();

    // Mutators
//  void add(Matrix m2);
//  void subtract(Matrix m2);
    void setelem(int r, int c, double val);

    // Accessors
//  void add(Matrix m2);
//  void subtract(Matrix m2);
    int getrows();
    int getcols();
    double getelem(int r, int c);
    bool equals(Matrix m2);
    char display();
    int WriteToArray(double &CopyOfArray);

};
#endif
4

2 に答える 2

0
double *cff;
a.WriteToArray(&cff);

ポインタを宣言し、それを初期化する前に使用します。何も指さないポインタを関数に渡しています。コンパイル時にサイズがわかっている場合は、配列を静的に宣言する必要があります

double cff[16]; // 4x4 array, for example
a.WriteToArray(cff);

または、関数を呼び出す前に適切なサイズにします。

double * cff = new double[n_rows * n_cols];
a.WriteToArray(cff);

他のいくつかの批判:あなたの関数は引数としてdoubleへの参照を期待しています。配列を受け取りたい場合、それを行う通常の方法はポインタを要求することです。より良い方法は、それらをまったく使用せず、何らかの方法でスマートポインタを使用することです。

メソッド自体も壊れています。

CopyOfArray[i]=array[i*n_cols];
i++;

これにより、配列の各行の最初の要素を書き込み、それらの間に1つのスペースを空けておきます。

ネストされたループが必要です。また、何も返さないでください。すでにパラメータ配列に書き込んでいるため、戻り値は冗長です。また、ポインタをintとして返すことは絶対にしないでください。ポインタとして返す必要があります。ただし、メソッドでポインターを初期化してから、ポインターを返し、呼び出した場所でキャッチすることもできます。

また、配列が適切なサイズであると想定しますが、これは、独自の例で証明されているように、正しくありません。常にポインタを初期化する必要があります。次のように、少なくとも0を指定します。

double *cff = NULL; // = 0 also works, but I like pointing pointers to NULL

この方法は、私ができる限り修正したもので、以下のとおりです。

double * Matrix::WriteToArray(){
    double * CopyOfArray = NULL;
    CopyOfArray = new double[n_rows*n_cols];
    int i, j;
    for(i=0;i<n_rows;i++){
        for(j=0;j<n_cols;j++){
        CopyOfArray[i*n_rows+j]=array[i*n_rows+j];
        i++;
        }
    }
    return CopyOfArray;
}

次に、そのように呼び出します。

double *cff = NULL;
cff = a.WriteToArray();

警告:戻り値を保存せずにメソッドを呼び出すと、メモリリークが発生します。ポインターを使用せず、スマートポインターについて学びます。

于 2012-12-18T00:49:57.843 に答える
0

あなたがしたい

int Matrix::WriteToArray(double CopyOfArray[], const int size){
    //make sure size >= n_rows then copy
}

そしてそれをそのように呼びます

double cff[MAX_SIZE] = {};
a.WriteToArray(cff);

実際には std::vector を使用する必要があり、動的割り当てについて心配する必要はありません。

編集:本当にしたい場合は手動で割り当てを行うことができますが、リリースには注意してください:

double* cff = 0;
a.WriteToArray(cff);
//do stuff with cff
delete [] cff;

そして、あなたの中に関数を書きます

int Matrix::WriteToArray(double *dest){
 dest = new double[n_rows];
 //copy data into dest
}

主なことは、メモリリークがないように、メインで使用し終わったら必ず dest を削除することです。

于 2012-12-18T00:25:34.093 に答える