动态内存分配&矩阵计算

时间:2015-09-02 05:56:18

标签: c++

这是我刚写的一段代码。声明所有变量。其目的是初始化矩阵的值,使得矩阵元素(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}}

2 个答案:

答案 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变量根本不会被更改,因为它是两个不同的变量。