程序崩溃,因为 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 拥有来自网络摄像头的所有条目,是否有代码要检查?
如果 reverse
是 standard 容器,那么您可以使用例如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 ybg
ybg => ivb
ivb 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 全局异常处理器 )