这是我刚写的一段代码。声明所有变量。其目的是初始化矩阵的值,使得矩阵元素(i行,j列)包含值(i-j)。结果希望与以下输出类似:
double data[1]; // Initialize the array
if (type == 'd') // Set the array to the correct size (not sure if it's correct)
{
double* data = new double [arraysize];
}
else if (type == 'f')
{
float* data = new float [arraysize];
}
else if (type == 'i')
{
int* data = new int [arraysize];
}
for (int i = 0; i <= arraysize; i++) // Fill the array with desired data
{
int numofrow = (i / columns) + 1;
int numofcol = (i % columns) + 1;
data[i] = numofrow - numofcol;
}
cout << "a = " << endl; // Start to output the result
for (int i = 0; i < rows; i++) // Nest for loop to output one row by another
{
for (int j = 0; j < columns; j++)
{
cout << " " << showpoint << setprecision(1) << setw(8) << right << data[columns*i+j];
}
cout << "\n";
}
然而,下面的代码对我来说不起作用,我无法找到原因。此外,我不确定是否允许我在那里分配新的内存位置,如if语句。
{{1}}
答案 0 :(得分:4)
C ++不允许你改变变量的类型;即data
。它从一开始就是double[1]
,所以它会是。您在if (type == ...)
正文中执行的操作是声明一个新变量,该变量仅在此条件的正文中可见,隐藏原始data
。
如果你想为多种数据类型做同样的事情,你应该使用一个函数模板(哦,并使用std::vector
而不是原始指针 - 你不需要记住删除,你得到一个很多免费):
template<typename T> void doTheMatrix(const int rows, const int columns) {
const auto size = rows * columns;
std::vector<T> data(size);
for (int i = 0; i != size; ++i) {
int numofrow = (i / columns) + 1;
int numofcol = (i % columns) + 1;
data[i] = numofrow - numofcol;
}
... the output code
}
并从您的类型开关调用此函数:
switch (type) {
case 'd': doTheMatrix<double>(10, 10); break;
case 'f': doTheMatrix<float>(10, 10); break;
case 'n': doTheMatrix<int>(10, 10); break;
}
答案 1 :(得分:1)
这都错了。
这段代码没有意义:
double data[1]; // outer data variable
if (type == 'd')
{
double* data = new double [arraysize]; // inner data variable
}
变量data
超出if
集团末尾的范围。所有这一切都会造成内存泄漏,没有别的。如果data
块被执行,则外部if
变量根本不会被更改,因为它是两个不同的变量。