如何将零填充的多维数组传递给 C++ 中的函数?

Posted

技术标签:

【中文标题】如何将零填充的多维数组传递给 C++ 中的函数?【英文标题】:How to pass the zero-filled multidimensional array to a function in C++? 【发布时间】:2020-07-01 12:04:31 【问题描述】:

我想将我的零填充 nullMat 多维指针数组传递给构造函数中名为 setGraphics 的函数。无论我以何种方式尝试这样做,我都会得到“参数不兼容”或类似的东西。

cpp文件Test.cpp

#include "Test.h"
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsView>

Test::Test(QWidget *parent) : QMainWindow(parent)
  
    ui.setupUi(this);
    lifeMatrix(5);
    setGraphics(nullMat(), 50);
    


void Test::setGraphics(bool **lifeMat, int scale)

    QGraphicsScene* scena = new QGraphicsScene();
    ui.view->setScene(scena);
    int lDydis = 50;        // nusistato langelio dydis, bus galima pakeist i variable
    for (int row = 0; row < scale; row++)
    
        for (int column = 0; column < scale; column++)
        
            QGraphicsRectItem* rect = new QGraphicsRectItem();
            rect->setRect(row * lDydis, column * lDydis, lDydis, lDydis);          
            if (lifeMat[row][column] == 1) rect->setBrush(Qt::white);
            if (lifeMat[row][column] == 0) rect->setBrush(Qt::black);
            rect->show();
            scena->addItem(rect);

        
    

以及头文件Test.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_Test.h"

class Test : public QMainWindow

    Q_OBJECT

public:
    Test(QWidget *parent = Q_NULLPTR);
    void nullMat(bool **lifeMat)  for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) lifeMat[i][j] = 0; ;
    void setGraphics(bool** lifeMat, int);
    int scale; // common, nustato matricos dydi rpagal column/row nariu skaiciu
    void lifeMatrix(int scale)
    
        // Matricos dydis x*y
        bool** lifeMat = new bool* [scale];
        for (unsigned int i = 0; i < scale; ++i) lifeMat[i] = new bool[scale];
    
private:
    Ui::TestClass ui;
    
;

我不知道如何解决这个问题,我已经尝试了很长时间。 任何帮助将不胜感激。

【问题讨论】:

你正在使用nullMat(),就好像它正在返回一些东西(setGraphics(nullMat(), 50);),但它被定义为void:void nullMat(bool **lifeMat),带有一个参数。你想怎么拥有它? 使用C++ containers 并在编译时启用所有警告和调试信息(使用GCC,您将使用g++ -Wall -Wextra -g 【参考方案1】:

您似乎不明白何时从函数返回值。 lifeMatrix 正在创建矩阵,因此它需要返回矩阵。 nullMat只是修改矩阵,不需要返回矩阵。

像这样重写你的代码

class Test : public QMainWindow

    ...
    void nullMat(bool **lifeMat)  ... 
    ...
    bool **lifeMatrix(int scale)
    
        // Matricos dydis x*y
        bool** lifeMat = new bool* [scale];
        for (unsigned int i = 0; i < scale; ++i) lifeMat[i] = new bool[scale];
        return lifeMat;
    
    ...


Test::Test(QWidget *parent) : QMainWindow(parent)
  
    ui.setupUi(this);
    bool** mat = lifeMatrix(5);
    nullMat(mat);
    setGraphics(mat, 50);

代码似乎仍然在泄漏内存,因为矩阵从未在任何地方删除。也许您实际上需要使矩阵成为成员变量。这将再次更改代码。

【讨论】:

非常感谢您的回答!是的,我仍然深入学习编码的部分,你的帮助真的让我理解了我的错误。这确实帮助我消除了这个问题,但现在我在这行 if (lifeMat[row][collumn] == 1) rect-&gt;setBrush(Qt::white); 中遇到了一个异常 Exception thrown at 0x00007FF701DA2B88 in Test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF. occurred 所以我认为问题出在lifeMatrix(5); ... setGraphics(nullMat(), 50);scale 的值应该是 5 还是 50?目前lifeMatrix 正在创建一个 5x5 矩阵,但 setGraphics 正在使用 50x50 矩阵。 你是绝对正确的。两种情况下都应该是 5,我在写的时候搞砸了。我是这个社区的新手,你已经让我很开心。谢谢!

以上是关于如何将零填充的多维数组传递给 C++ 中的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多维数组传递给 C 和 C++ 中的函数

C,如何将多维数组传递给 CLR/类库项目中的函数

c++ - 如何将多维数组传递给没有内部维度的函数? [复制]

C++ 数组与字符串⁽²³⁾|函数与数组

将多维数组传递给函数 C

传递可变大小的多维数组