我必须在使用C++一段时间后回到(嵌入)C,并遇到以下问题:
我有一个很多次包含的源模块,让我们调用它utilities.h,utilities.c
在它里面,我有一个重要的数组,让我们称它为
#define IMPORTANT_ARRAY_LENGTH 10000
char important_array[IMPORTANT_ARRAY_LENGTH];
Run Code Online (Sandbox Code Playgroud)
我在这个utilities模块中有很多其他功能,它们都可以正常工作.但是,在其他一个源文件中,让我们调用它worker.c,我必须使用这个数组.什么是"官方",优雅的方式来做到这一点,而不必把extern char important_array[IMPORTANT_ARRAY_LENGTH]宏观定义放在worker.c?
如果我执行以下操作:
utilities.h
#ifndef _UTILITIES_H_
#define _UTILITIES_H_
#define IMPORTANT_ARRAY_LENGTH 10000
extern char important_array[IMPORTANT_ARRAY_LENGTH];
// ...
Run Code Online (Sandbox Code Playgroud)
utilities.c
#ifndef _UTILITIES_C_
#define _UTILITIES_C_
#include "utilities.h"
char important_array[IMPORTANT_ARRAY_LENGTH];
// ...
Run Code Online (Sandbox Code Playgroud)
worker.c
#include "utilities.h"
// ...
important_array[0] = 0;
Run Code Online (Sandbox Code Playgroud)
然后我的数组将是一个未定义的符号worker.c.如果我不使用extern关键字in utilities.h,那么它当然是一个重复的符号.(奇怪的是,它只用一个警告编译,我可以从链接器文件中看到大小被多次分配.)
我真的必须申报我的阵列worker.c吗?我想保持一切干净,并且只在一个地方包含所有声明:在头文件中.我想只有一次宏定义(这是次要的,因为我可以使用const,但我希望预处理器能够处理它,而不是占用它)
我有一个QListWidget由自定义小部件使用setItemWidget.
这些自定义列表项是完全静态的,它们只有一堆带有各种文本和图像的标签。我的 QListWidget 显示正确。我允许拖放重新排序,当我将项目移动到不同位置后,它就会变得不可见。它不会消失,因为它占用了显示屏的空间,我什至可以点击它,它只是完全不可见,就好像它里面的所有标签突然变成了空白。有趣的是,如果我为这些小部件设置背景颜色,自定义背景颜色不会被清除,只会清除内容。
如果我将泛型插入QListWidgetItem到 中QListQidget,即使在移动后它们仍然可见。
是什么导致自定义小部件变为空白,如何阻止这种情况发生?
例子。
QListWidgetItem *item;
MyCustomWidget *custom;
item = new QListWidgetItem();
item->setText("This will remain visible");
listWidget->addItem(item);
item = new QListWidgetItem();
custom = new MyCustomWidget ();
custom->setName(QString("This will vanish")); // this will add text to one of the labels inside it.
listWidget->addItem(item);
item->setSizeHint(QSize(50,65));
listWidget->setItemWidget(item, custom);
Run Code Online (Sandbox Code Playgroud)
用鼠标移动项目后,通过“普通”QListWidgetItems 添加的项目保留其内容,而通过“普通”QListWidgetItems 添加的项目setItemWidget其内容消失。
编辑
即使我的自定义小部件只是一个QLabel,其内容在移动后也会消失。
QLabel *label;
item = new QListWidgetItem();
label = new QLabel();
label->setText("This label will vanish"); …Run Code Online (Sandbox Code Playgroud) 我需要做以下事情:我在微控制器上有2个输入引脚,并且有可能在一个或另一个上接收到一个信号,但也可能两者在外部物理连接,并且信号同时到达.
问题:如果我使用类似的东西
if (PINB.1 && PINB.2)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
存在百万分之一的机会,信号在两个值被加载到寄存器之间到达以进行逻辑AND操作.当我离开时if,两个引脚都很高,但我仍然检测到只有第二个引脚很高.
我尝试了不同的解决方案,到目前为止,最好的选择是在任何一个输入高电平时启动一个非常短的倒计时,当计时器(最多几毫秒)运行时,我再次检查.
有谁知道更简单或更好的解决方案?我认为这个问题非常普遍,但到目前为止我找不到任何"经过验证的"方法.
编辑:我从硬件上知道,在一个边缘之后,引脚将保持其值至少几十毫秒.噪音已被照顾.
PINB.1和PINB.2就是例子.它们可能位于不同的端口上,因此对整个端口进行位掩码可能存在不够灵活的风险.
例如,在嵌入式编程中,由于以下原因,#define GLOBAL_CONSTANT 42首选const int GLOBAL_CONSTANT = 42;:
const 不仅需要闪存中的存储位置,而且编译器会在程序开头生成额外的代码来复制它.反对使用的所有这些优点,使用#define的主要优点是const什么?在非μC环境中,内存通常不是一个大问题,并且const因为它可以在本地使用而有用,但是全局常量呢?或者答案只是"我们永远不应该使用全局常量"?
编辑:
这些例子可能引起了一些误解,所以我必须声明它们在C中.如果C编译器为这两者生成了完全相同的代码,我认为这将是一个错误,而不是一个优化.
我只是将问题扩展到C++而不考虑它,希望获得新的见解,但我很清楚,在面向对象的环境中,全局常量的空间很小,无论它们是宏还是consts.
正如 aQPushButton提供默认clicked()信号一样,我希望QScrollArea有一个sliderChanged()或类似的信号。有趣的是,QScrollBar确实有这样的信号。
我想要做的就是知道滚动区域内巨大小部件的哪一部分是可见的,无论何时用户滚动它。
有很多解决方案,但对我来说没有一个是优雅的:
QScrollAreaQScrollBar有没有没有子类化的方法?
为 qml 项设置背景的最简单方法是让子矩形的锚点完全填满父项:
Item
{
width: 320
height: 240
Rectangle
{
id: background
anchors.fill: parent
color: "blue"
}
// other items
}
Run Code Online (Sandbox Code Playgroud)
但是,这只适用于父项定义了大小(宽度和高度)。
我想要一个容器,但没有为其定义固定大小。孩子们将有固定的尺寸,但由于孩子们可以动态改变他们的尺寸,我希望父容器能够增长和缩小以适应。
如果我按顺序锚定孩子,除了背景之外,一切都很好。
有一个问题,前一阵子关于类似的话题,但问题是,所有的孩子们并排而不是重叠显示的一面。这不是我的问题,因为按顺序锚定它们(或使用 a RowLayout)可以正确显示它们。
Item
{
// I don't want a fixed size here
Rectangle
{
id: background
anchors.fill: parent
color: "blue"
}
RowLayout
{
anchors.fill: parent
Item
{
id: child1
anchors.left = parent.left
anchors.top: parent.top
width:100
height:100
}
Item
{
id: child2
anchors.left = child1.right
anchors.top: parent.top
width:120
height:120
}
// further …Run Code Online (Sandbox Code Playgroud) c ×3
c++ ×2
qt ×2
concurrency ×1
embedded ×1
polling ×1
qlistwidget ×1
qml ×1
qtgui ×1
scrollbar ×1