如何将零填充的多维数组传递给 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->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++ 中的函数?的主要内容,如果未能解决你的问题,请参考以下文章