我有这个方法(Matrix :: WriteToArray(double& CopyOfArray))我想在Matrix对象中将数组的副本写入双精度数组(即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);
/*...*/
}
Matrix.cc
int Matrix::WriteToArray(double &CopyOfArray){
int i;
for(i=0;i<n_rows;i++){
CopyOfArray[i]=array[i*n_cols];
i++;
}
return *CopyOfArray;
}
Matrix.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
答案 0 :(得分: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
}
主要的是确保在main中使用它时删除dest,这样就没有内存泄漏。
答案 1 :(得分: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++;
这将导致您编写数组中每行的第一个元素,并在它们之间留空一个空格。
您需要一个嵌套循环。您也不应该返回任何内容,您已经写入参数数组,因此返回值是多余的。您也应该永远不会将指针作为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();
警告:如果在不存储返回值的情况下调用方法,则会泄漏内存。不要使用指针,了解智能指针。