【问题标题】:"imspossible" error on a simplest code [closed]最简单代码上的“不可能”错误[关闭]
【发布时间】:2017-04-28 23:50:51
【问题描述】:

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

#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” 请帮我!

【问题讨论】:

  • printMatrix 期望 float** 但你正在传递 float
  • 除了float createMatrix( int N ) 泄漏内存(和创建单个float 而不是float 矩阵)。
  • 为什么printMatrix 需要一个指向指针的指针?你想做什么?你传递了一个float 并期待一个**float!!
  • new float*[N] 从不返回 null,如果返回,free(nullptr) 无效。
  • @aschepler free(nullptr) 无效 不。正如here 解释的那样:如果 ptr 是空指针,则该函数什么也不做。

标签: c++ compiler-errors compilation


【解决方案1】:

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

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: 正如在 cmets 中更正的那样,并非所有指针都有 4 字节大小。在 64 位系统中,它有 8 个。

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

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

【讨论】:

  • _这是因为矩阵是pointer,并且所有指针的大小都是4字节_不正确。 64位系统上指针的大小是多少?
  • @AlgirdasPreidžius 你说得对。指针也可以是 8 个字节。而且也不总是8。谢谢指正。
  • free(matrix) 应该是delete[] matrix
  • @Barmar 不仅仅是delete[] m;,还有for (int i = 0; i &lt; N; ++i) { delete m[i]; } delete[] m;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多