小编vsz*_*vsz的帖子

是否有一种优雅的方式来强制比较两个常量?

众所周知,以下代码将由所有合理的编译器优化:

const int a = 3;
const int b = 42;

if (a == b)
{
    do_something();
}
Run Code Online (Sandbox Code Playgroud)

如果两个常量相同,if则省略并始终调用函数,如果它们不同,则省略整个块.

但是,在某些情况下,重要的是不要优化此代码,因为程序本身可以在运行之前进行修改.例如,二进制文件位于闪存中,可由外部程序访问,当然两者的地址const是固定的.(在嵌入式中有意义).

我正在考虑使用#pragma,但这不是C标准的一部分.

另一种方法是使用const volatile.这是否可以保证适用于所有符合标准的编译器?

c

27
推荐指数
2
解决办法
569
查看次数

有没有办法为C或C++结构强制执行特定的字节序?

我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据.

但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么.是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的很多宏的整个事情?

一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意.

编辑:

感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的.

特定处理器生成大量数据(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理)读取.对数据进行字节评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层.

改变嵌入式处理器的软件是不可能的.源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据.

这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要.

它不一定是字节序的真正变化.即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受.

c c++ endianness low-level

25
推荐指数
2
解决办法
1万
查看次数

在Qt线程之间发送大量数据

我有一个QThread定期生成相当大量的数据(每秒几兆字节),并且需要将其传输到父(GUI)线程.

我担心我在内部工作中并不确定,QThread所以我想要求最佳实践.

显然,传输数据的最直接方式是仅emit使用数组.但是,这有多高效?Qt是否知道它的使用位置并避免在发送和接收时对其进行深度复制?

如果没有,我很乐意只在主线程中分配内存并给出一个指向子线程的指针,它将写入数据(并且只有emit关于进度的短消息).这对我来说似乎不是最优雅的解决方案,这就是我要问的原因.

如果Qt避免在发送和接收时复制多个缓冲区中的数据,是否可以在所有系统中保证?我没有资源在各种操作系统下尝试对其进行基准测试.

c++ qt multithreading qthread

20
推荐指数
2
解决办法
9356
查看次数

"=="评估为大于1的任何C编译器?

作为任何非零值意味着真实的,但是>,<,==等运营商回归1真正的,我如果有任何显着的C编译器,当这些运营商可能会导致的值大于好奇1.

换句话说,是否有任何编译器int i = (a==b); 如果我打算不使用i不作为布尔值,而是作为一个整数,并假设它将是0或者1?会导致未定义的行为

c undefined-behavior

11
推荐指数
2
解决办法
1307
查看次数

将OpenCV窗口嵌入到Qt GUI中

OpenCV最近升级了它的显示窗口,当它在Qt中使用时.它看起来非常好,但我没有发现它嵌入现有Qt GUI窗口的任何可能性.唯一的可能性似乎是创建一个cvNamedWindowcv::namedWindow,但它创建了一个自由浮动的独立窗口.

是否有可能现有GUI中创建OpenCV窗口?我在OpenCV论坛上找到的所有内容都是一个悬而未决的问题,有点类似于我自己的问题.

在Qt中显示OpenCV图像是一种直接的可能性,但它有两个主要问题:

  1. 它涉及逐个像素地复制图像,而且速度很慢.它具有每个像素的函数调用!(在我的测试应用程序,如果我创建了一个视频输出的图像,并在显示它cvNamedWindow,它运行速度非常流畅,甚至为多部影片的同时,但如果我去通过IplImage- > QImage- > QPixmap- > QLabel航线,即使是一个视频也有严重的延迟)
  2. 我不能使用它的那些漂亮的新控件cvNamedWindow.

c c++ qt opencv

9
推荐指数
1
解决办法
1万
查看次数

为什么C中的字符串函数在使用char而不是unsigned char的数组上工作?

C标准库函数中,字符串的元素是chars.是否有一个很好的理由来决定它而不是unsigned char

使用unsigned char8位字符串有一些虽然小的优点:

  • 它更直观,因为我们通常将ASCII码记忆为无符号值,并且在处理二进制数据时,我们更喜欢范围0x00到0xFF,无符号,而不是处理负数.所以我们要投.
  • 使用无符号整数可能更快/更有效,或者在某些处理器上生成更小的代码.

c string

9
推荐指数
1
解决办法
1292
查看次数

如何在Qt样式中平滑缩小背景图像的尺寸?

默认情况下,Qt使用一种非常简单,快速和丑陋的缩放图像方式Qt::FastTransformation,可能是最近邻插值或类似的东西.

在处理a时QPixmap,可以选择视觉上更好的缩放,例如,

pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation);
Run Code Online (Sandbox Code Playgroud)

但是,如果图像不在QPixmap对象中,而只是按钮的背景或其他小部件,我们可以做什么?

例如,以下是一种非常简单的方法,可以创建自动调整大小,完全自定义的按钮,非常适合与分辨率无关的应用程序,当与布局和使用时setStretch().

ui->pushButton->setStyleSheet(
    "QPushButton { border-image: url(:/img/button.png) 0 0 0 0 stretch stretch; }"
    "QPushButton:checked { border-image: url(:/img/button_checked.png) 0 0 0 0 stretch stretch; }"
    "QPushButton:pressed { border-image: url(:/img/button_pressed.png) 0 0 0 0 stretch stretch; }"
    "QPushButton:checked:pressed { border-image: url(:/img/button_checked_pressed.png) 0 0 0 0 stretch stretch; }"
    );
Run Code Online (Sandbox Code Playgroud)

我使用border-image而不是background-image由于Qt样式表的缺陷.

如何使用样式表中使用的图像进行更平滑的缩放?

使用pixmaps实现相同的功能更不优雅.我将不得不总是捕获调整大小事件,重新计算我所有小部件的新大小,并手动重新绘制它们.

编辑:

有趣的是,如果图像被放大,则平滑缩放与样式表一起使用,但在缩小图像时则不适用.

在以下示例中,在第一行中,使用32*32图标,在第二行中,使用大于2000*2000的统一网格.

例

css qt

9
推荐指数
1
解决办法
684
查看次数

当断点设置时,薛定谔虫就会消失

我的代码中有一个奇怪的错误,当我尝试调试时会消失.

在我的计时器中断(总是运行系统自动收报机)我有这样的事情:

 if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }
Run Code Online (Sandbox Code Playgroud)

在我的主循环中我有

 if (some_global_flag)
 {
     some_global_flag = 0;
     do_something_very_important();   // breakpoint 1
 }
Run Code Online (Sandbox Code Playgroud)

当计时器中的条件(我认为)满足时,主循环中的这种情况永远不会被调用.条件是外部的(portpins,ADC结果等).首先,我在位置1处放置一个断点,它永远不会被触发.

为了检查它,我把断点nr.2在线some_global_flag = 1;,在这种情况下代码工作:当条件为真时触发两个断点.

更新1:

要研究是否有一些时间条件负责,并且if如果在没有调试的情况下运行,则永远不会输入计时器,我在计时器中添加了以下内容:

 if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }


 if (some_global_flag)
 {
     #asm("NOP");    // breakpoint 3
 }
Run Code Online (Sandbox Code Playgroud)

该标志不会在代码中的任何其他位置使用.它在RAM中,RAM在开始时清零.

现在,当所有断点都被禁用时(或者只启用了main中的断点1),代码无法正常工作,则不执行该功能.但是,如果我只在NOP上启用断点3,则代码可以正常工作!断点被触发,继续后,执行该功能.(它有可见和可听的输出,所以它很明显,如果它运行)

更新2:

定时器中断通过其开头的"SEI"是可中断的.我删除了该行,但行为没有以任何明显的方式改变.

更新3:

我没有使用任何外部存储器.因为我非常接近flash中的限制,所以我在编译器中进行了最大化优化.

编译器(CodeVision)可以负责,还是我做错了什么?

c embedded atmega jtag

8
推荐指数
3
解决办法
1001
查看次数

防止C++ 11删除无限循环

正如在这个问题中所讨论的,C++ 11优化了无限循环.

然而,在具有单一目的的嵌入式设备中,无限循环是有意义的并且实际上经常被使用.即使是完全空的while(1);也适用于看门狗辅助复位.终止但空循环在嵌入式开发中也很有用.

是否有一种优雅的方式来专门告诉编译器不要删除空循环或无限循环,而不完全禁用优化?

c++ embedded c++11

8
推荐指数
1
解决办法
473
查看次数

什么是carotene_o4t,为什么在Android上使用opencv和Qt编译程序时会出现问题?

我正在使用Qt编写一个Android应用程序,使用opencv.我设置了所有内容,以便我的应用程序无需opencv即可正常运行.但是,在我包含opencv 3.2(通过下载最新的sdk并设置库路径)之后,编译失败了数百个未定义的引用错误,所有这些都涉及到carotene_o4t.

C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::isSupportedConfiguration()'
C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::cmpGE(carotene_o4t::Size2D const&, unsigned char const*, int, unsigned char const*, int, unsigned char*, int)'
C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): …
Run Code Online (Sandbox Code Playgroud)

qt android opencv

8
推荐指数
1
解决办法
2538
查看次数