最简单的代码上的“imspossible”错误

时间:2017-04-28 23:50:52

标签: c++ compiler-errors compilation

我正在努力跑,但我不能。也许它与指针有关, 我已经失去了期望。

#include <iostream>
using namespace std;
float createMatrix( int N )
{
    int i,j;
    float **matrix;
    matrix = new float*[N];
        if (matrix == NULL)
        {
            free(matrix);
            return 0;
        }
    for (i=0; i<N; i++)
        matrix[i] = new float[N];
    for(i=0; i<N;i++)
        for(j=0; j<N;j++)
            matrix[i][j] = rand();
    return **matrix;
}
void printMatrix (float **matrix)
{
    int N = sizeof(matrix)/sizeof(float);
    for(int i=0; i<N;i++)
    {
        for(int j=0; j<N;j++)
            std::cout << (matrix)[i][j];
    std:: cout << std::endl;
    }
}
int main(int argc, const char * argv[]) {
    int N=0;
    std::cout << "Hello! Please, write any number for a size of the matrix\n";
    std::cin >> N;
    float m = createMatrix(N);
    printMatrix(m); // error
    return 0;
}

错误:没有匹配函数来编译'printMatrix' 请帮我!

1 个答案:

答案 0 :(得分:2)

你必须从这个函数返回指向float的指针。但你现在只返回第一个值。

float** createMatrix( int N )
{
    int i,j;
    float **matrix;
    matrix = new float*[N];
        if (matrix == NULL)
        {
            free(matrix);
            return 0;
        }
    for (i=0; i<N; i++)
        matrix[i] = new float[N];
    for(i=0; i<N;i++)
        for(j=0; j<N;j++)
            matrix[i][j] = rand() % 5; // not just rand(), in this case you become numbers in range [0, max int)
    return matrix;
}

然后也存储你的矩阵。应存储指针,而不是第一个值。

float **m = createMatrix(N);

下一行将始终为您提供1.这是因为matrix是一个指针,所有指针都有4个字节的大小。所以你有4/8 == 1。

int N = sizeof(matrix)/sizeof(float);

如果是原始dyn数组,我们需要将大小作为参数传递。

void printMatrix(float **matrix, int N) { /* do work */ }

最后你调用这个函数。

printMatrix(m, N);

但是在C ++中你应该使用std并且不关心所有这些指针,看起来实际上很糟糕。 std::vector这对我们有用。

编辑1: 正如在注释中所纠正的那样,并非所有指针都有4个字节的大小。在64位系统中,它有8个。

编辑2: 我们不应该忘记释放记忆:

for (int i = 0; i < N; ++i) {
    delete m[i];
}
delete[] m;