程序崩溃,因为 std::rotate_copy

Posted

技术标签:

【中文标题】程序崩溃,因为 std::rotate_copy【英文标题】:Program crashes, because of std::rotate_copy 【发布时间】:2014-11-20 08:23:12 【问题描述】:

我正在尝试显示两个彼此相邻的凸轮,旋转 90°。显示两个凸轮工作正常,但如果我想旋转凸轮,程序会崩溃。 使用 QByteArray 读取相机并使用 QCamera 变量显示。 您可以选择在哪个取景器中显示哪个相机,所以它有这样的代码:

QActionGroup *videoDevicesGroup = new QActionGroup(this);
videoDevicesGroup->setExclusive(true);
foreach(const QByteArray &deviceName, QCamera::availableDevices()) 
    QString description = camera->deviceDescription(deviceName);
    QAction *videoDeviceAction = new QAction(description, videoDevicesGroup);
    videoDeviceAction->setCheckable(true);
    videoDeviceAction->setData(QVariant(deviceName));
    if (cameraDevice.isEmpty()) 
        cameraDevice = deviceName;
        videoDeviceAction->setChecked(true);
    
    ui->menuDevices->addAction(videoDeviceAction);

    connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), SLOT(updateCameraDevice(QAction*)));
if (cameraDevice.isEmpty())

    camera = new QCamera;

else

    camera = new QCamera(cameraDevice);

connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State)));
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError()));
camera->setViewfinder(ui->viewfinder);
updateCameraState(camera->state());
camera->start();

现在我正在尝试使用以下命令旋转这个凸轮:

std::roate_copy(cameraDevice.constBegin(), cameraDevice.constEnd(), cameraDevice.constEnd, reverse.begin());
camera = new QCamera(reverse);

但是当我尝试启动程序时,程序崩溃了,没有任何错误。

我该如何解决这个问题?

【问题讨论】:

您是否应该传递cameraDevice.constEnd 函数(即不调用它)?您是否在 reverse 中创建了足够的条目以容纳来自 cameraDevice 的所有条目(它们不会自动创建)? 问题是,中间的迭代器旋转相机90°不知道写什么 @AlexFarber 它编译没有错误。然后应用程序输出开始闪烁(每次程序启动时都会闪烁),然后出现程序崩溃的错误消息,但不是qt的消息,是windows @JoachimPileborg 如何检查我在反向和 cameraDevice 中有多少条目? cameraDevice 拥有来自网络摄像头的所有条目,是否有代码要检查? 如果 reversestandard 容器,那么您可以使用例如std::back_inserter 获取自动附加到容器末尾的迭代器。如果reverse 是一个Qt 容器,您必须查看他们的文档以查看他们是否有类似的东西(他们可能有)。另请阅读您使用的容器的文档,了解如何预先设置容器中的项目数。 【参考方案1】:

我认为您对 std::rotate_copy 的作用存在误解。

std::rotate_copy 获取一系列数据并在复制到 result 迭代器指向的位置时将其转移。

这不会旋转相机。它只是移动和复制范围:http://www.cplusplus.com/reference/algorithm/rotate_copy

编辑:

这样想,说我有:std::string("wroybgivb"); 现在说我做str::rotate_copy,然后我选择“y”作为中间,我复制到的std::string 将包含“ybgivbwro”。

现在想一想,就像我在处理 3X3 图像一样,每个字符代表一种颜色:

wro ybgybg => ivbivb wro

请注意,这是进行线性阵列旋转(位置移动)。我永远不能选择一个中间,这样行会变成列,列会变成行。

PS:

好吧,假设您知道图像的宽度,并将其分配给变量width。你可以这样做顺时针旋转 90°:

for(int x = 0; x < size; ++x)
    output[width - 1 - i / width + (i % width) * width] = input[i];

要理解这一点,您需要了解如何将线性数组索引为二维数组。 使用它来访问 x 坐标: i % width 使用它来访问 y 坐标: (i / width) * width

现在您需要获取这些索引并将它们仍在线性数组中旋转。 使用它来访问 x 坐标: width - 1 - i / width 使用它来访问 y 坐标: (i % width) * width

【讨论】:

是的,但是相机的数据保存在 QByteArray 中,如果我旋转数组,则必须旋转图像。或者阵列和相机阵列有区别吗?在 QByteArray 中只保存了每个像素的信息。 @Der_Pätti 编辑帮助解释。 我明白了...但是您甚至可以旋转 QCamera 吗?或者在 C++ 中是否可行,因为我尝试了很多东西但没有任何效果...... @Der_Pätti 再编辑一次。如果您对旋转线性阵列还有其他问题,您可能应该接受这个答案,我们开始一个新问题;因为我们离最初的问题还很远。

以上是关于程序崩溃,因为 std::rotate_copy的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

协程不断崩溃而不显示错误

应用程序在 assert() 上崩溃

android-在崩溃或退出时远程重启应用程序

由于无法重现的崩溃,Apple 拒绝了应用程序