小编vsz*_*vsz的帖子

最优雅的方式来共享一个C数组

我必须在使用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,但我希望预处理器能够处理它,而不是占用它)

c global-variables

5
推荐指数
1
解决办法
4175
查看次数

QListWidget 中的项目在重新排序后变得不可见

我有一个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)

c++ qt qlistwidget qtgui qlistwidgetitem

5
推荐指数
1
解决办法
1594
查看次数

在两个输入引脚上检测两个同时信号的最佳做法

我需要做以下事情:我在微控制器上有2个输入引脚,并且有可能在一个或另一个上接收到一个信号,但也可能两者在外部物理连接,并且信号同时到达.

问题:如果我使用类似的东西

if (PINB.1 && PINB.2)
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

存在百万分之一的机会,信号在两个值被加载到寄存器之间到达以进行逻辑AND操作.当我离开时if,两个引脚都很高,但我仍然检测到只有第二个引脚很高.

我尝试了不同的解决方案,到目前为止,最好的选择是在任何一个输入高电平时启动一个非常短的倒计时,当计时器(最多几毫秒)运行时,我再次检查.

有谁知道更简单或更好的解决方案?我认为这个问题非常普遍,但到目前为止我找不到任何"经过验证的"方法.

编辑:我从硬件上知道,在一个边缘之后,引脚将保持其值至少几十毫秒.噪音已被照顾.

PINB.1和PINB.2就是例子.它们可能位于不同的端口上,因此对整个端口进行位掩码可能存在不够灵活的风险.

c embedded concurrency polling

3
推荐指数
1
解决办法
854
查看次数

const与#define对全局常量的主要优点是什么?

例如,在嵌入式编程中,由于以下原因,#define GLOBAL_CONSTANT 42首选const int GLOBAL_CONSTANT = 42;:

  • 它不需要放在RAM中(在微控制器中通常非常有限,μC应用通常需要大量的全局常量)
  • const 不仅需要闪存中的存储位置,而且编译器会在程序开头生成额外的代码来复制它.

反对使用的所有这些优点,使用#define的主要优点是const什么?在非μC环境中,内存通常不是一个大问题,并且const因为它可以在本地使用而有用,但是全局常量呢?或者答案只是"我们永远不应该使用全局常量"?

编辑:

这些例子可能引起了一些误解,所以我必须声明它们在C中.如果C编译器为这两者生成了完全相同的代码,我认为这将是一个错误,而不是一个优化.

我只是将问题扩展到C++而不考虑它,希望获得新的见解,但我很清楚,在面向对象的环境中,全局常量的空间很小,无论它们是宏还是consts.

c c++

3
推荐指数
1
解决办法
3544
查看次数

每当用户滚动 QScrollArea 时获得通知的最简单方法是什么?

正如 aQPushButton提供默认clicked()信号一样,我希望QScrollArea有一个sliderChanged()或类似的信号。有趣的是,QScrollBar确实有这样的信号。

我想要做的就是知道滚动区域内巨大小部件的哪一部分是可见的,无论何时用户滚动它。

有很多解决方案,但对我来说没有一个是优雅的:

  1. 子类 QScrollArea
  2. 将滚动区域内的小部件子类化,并重新实现其绘制事件。
  3. 创建自定义 veiwport,使用 QScrollBar
  4. 定期轮询滚动区域内小部件的位置。这似乎是最糟糕的解决方案。

有没有没有子类化的方法?

qt scrollbar

3
推荐指数
1
解决办法
2198
查看次数

如何为未指定大小的 qml 项设置背景?

为 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)

qml

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