小编Amb*_*jak的帖子

如何在 VS Code 中从命令行打开远程文件夹?

我可以启动 VS Code 以使用code /path/to/folder. 是否可以通过在命令行上指定计算机和文件夹来打开远程计算机上的文件夹(通过远程 SSH 扩展)?

visual-studio-code

14
推荐指数
1
解决办法
6558
查看次数

C++编译时bignum库

在C++中是否有任何编译时库(模板元编程)用于任意精度算术?

我需要这个来帮助我的AVR微控制器程序中的定点算术和二进制缩放.例如,当两个数字各自具有自己的边界时,bignums将用于计算结果的边界,并在适当时移动输入和/或输出中的分数点.但是结果的边界可能无法在标准整数类型中表示.

c++ fixed-point bignum compile-time template-meta-programming

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

__builtin_round不是常量表达式

在G ++中,在某些条件下,各种内置数学函数都是constexpr.例如,以下编译:

static constexpr double A = __builtin_sqrt(16.0);
static constexpr double B = __builtin_pow(A, 2.0);
Run Code Online (Sandbox Code Playgroud)

它们并不总是constexpr,它取决于论点.例如,__builtin_sqrt(NAN)当用作常量表达式时会导致编译错误.

但是我遇到了一个奇怪的案例,在我看来它应该是constexpr,但它不是:

static constexpr double value () { return 1.23; }
static constexpr double result = __builtin_round(__builtin_sqrt(value()));
Run Code Online (Sandbox Code Playgroud)

这会产生:

a.cpp:2:73: error: ‘__builtin_round(1.1090536506409416e+0)’ is not a constant expression
 static constexpr double result = __builtin_round(__builtin_sqrt(value()));
                                                                         ^
Run Code Online (Sandbox Code Playgroud)

我尝试过以上代码的变体,我发现:

  • 这个问题__builtin_round有一些特殊的作用.用其他内置数学函数替换它,例如sqrtpow解决错误.所以看起来__builtin_round只是缺乏constexpr支持.但...
  • 如果value()被文字替换1.23,那也会删除错误.
  • __builtin_sqrt仅删除,只__builtin_round(value())删除错误.

我想知道为什么round会以这种方式表现,如果有任何解决方法.

注意.我知道内置的数学函数及其constexpr-ness是非标准的编译器特有的功能.请不要告诉我如何不使用它,或者我不应该如何编写时间数学.在我的情况下,有constexpr数学是一个重要的功能,我很好依赖于G ++.

c++ floating-point g++ built-in constexpr

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

C++:奇怪的"私有"错误

我从g ++那里得到了一个非常不寻常的错误,声称类型别名是私有的.经过几个小时的减少我的代码,我已经达到了以下最小的测试用例:

template <typename Dummy>
class Test {
    struct CatDog {
        static void meow ()
        {
            CrazyHouse::TheCatDog::meow();
        }

        struct Dog {
            static void bark ();
        };
    };

    struct CrazyHouse {
        using TheCatDog = CatDog;

        static void startMadness ()
        {
            TheCatDog::meow();
            TheCatDog::Dog::bark();
        }
    };

public:
    static void init ()
    {
        CrazyHouse::startMadness();
    }
};

int main ()
{
    Test<void> t;
    t.init();
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.2的错误是:

test.cpp: In instantiation of 'static void Test<Dummy>::CatDog::meow() [with Dummy = void]':
test.cpp:19:29:   required from 'static void Test<Dummy>::CrazyHouse::startMadness() …
Run Code Online (Sandbox Code Playgroud)

c++ private class compiler-bug g++4.8

7
推荐指数
2
解决办法
5145
查看次数

如何在没有毛刺的情况下实现AVR的零占空比PWM?

我正在尝试在ATmega2560上使用硬件PWM,使用TC0(一个8位定时器),在快速PWM模式下.我需要动态调整占空比,这包括零占空比.然而,这似乎并不容易,甚至不可能.引用数据表:

OCR0A寄存器的极值表示在快速PWM模式下生成PWM波形输出时的特殊情况.如果OCR0A设置为BOTTOM,则每个MAX + 1定时器时钟周期的输出将为一个窄峰值.将OCR0A设置为MAX将导致恒定的高或低输出(取决于COM0A1:0位设置的输出的极性).

因此,将OCR0A设置为0(= BOTTOM)实际上不会导致占空比为零,我的测试证实了这一点.还需要采取其他一些方法.

首先,我已经教过如上所述使用OCR0A = MAX特殊情况.结合暂时切换到反转模式,这将导致零占空比.但是,由于COM0A1:0不是双缓冲(并且不与OCR0A同步),如果在输出为高电平时切换模式,这可能会导致输出出现毛刺(在下一次溢出之前它将保持高电平) ).OCR0A改变和模式改变的顺序似乎并不重要,两者都可能出现故障.

我还考虑了另一种解决方案,通过设置COM0A1来关闭PWM:0 = 0.这将立即将输出设置为PORT寄存器中的值,该值为零.但是仍然存在从零输出回到非零占空比的问题.根据我在数据表中的描述,设置COM0A1:0以重新使能PWM将立即将输出引脚切换到PWM的输出,这可能是一个不正确的值,直到下一个比较匹配或定时器溢出.因此,一个小故障.

总体上反转PWM可能是适用的,但是问题恰好变为完全占空比,具有对称问题.

请注意,在通过PORT强制引脚输出时,不能启用PWM波形生成,如数据表中所述:

比较输出模式(COM0x1:0)位有两个功能.波形发生器使用COM0x1:0位在下一个比较匹配时定义输出比较(OC0x)状态.此外,COM0x1:0控制OC0x引脚输出源.

没有办法让PWM运行一个周期左右,并在它准备就绪时切换到它 - 使能PWM立即强制引脚输出.

UPDATE.相位校正(中心对齐)PWM模式没有这个问题,在我的情况下是可以接受的.我已经尝试过并确认它适用于零占空比和全占空比.

embedded microcontroller avr atmel pwm

7
推荐指数
2
解决办法
5140
查看次数

如何检查duration_cast中的溢出

我需要将一种转换std::chrono::duration为另一种,但我需要知道何时无法进行这种转换,因为该值无法表示.

我没有在标准库中找到任何设施来检查这一点.该cppreference页面没有指定值是否超出范围会发生什么,只能从浮点到整数的转换可能是不确定的行为(在我来说,我需要从整数转换为整数).

c++ integer-overflow c++-chrono

7
推荐指数
1
解决办法
372
查看次数

使用placement-new,复制存储然后访问值undefined行为?

S是含有一个字符阵列的结构类型data,其具有的最大对齐和固定大小.这个想法是S能够存储任何类型T的对象,其大小不超过限制,并且可以简单地复制构造并且可以简单地破坏.

static constexpr std::size_t MaxSize = 16;
struct S {
    alignas(alignof(std::max_align_t)) char data[MaxSize];
};
Run Code Online (Sandbox Code Playgroud)

Placement-new用于将类型的对象构造T到新S对象的字符数组中.然后,该对象被复制任意次数,包括返回并按值传递.

template <typename T>
S wrap(T t) {
    static_assert(sizeof(T) <= MaxSize, "");
    static_assert(std::is_trivially_copy_constructible_v<T>, "");
    static_assert(std::is_trivially_destructible_v<T>, "");

    S s;
    new(reinterpret_cast<T *>(s.data)) T(t);
    return s;
}
Run Code Online (Sandbox Code Playgroud)

后来给出了这个S值的副本,reinterpret_cast用于T*从指针获取字符数组的开头,然后T以某种方式访问该对象.的T类型是相同的创建值时.

void access(S s) {
    T *t = reinterpret_cast<T *>(s.data);
    t->print();
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个方案中是否有任何未定义的行为以及它将如何解决.例如,我担心:

  • "重用对象存储"是否存在问题,即std::launder旨在解决的问题?我不确定data在构造一个实例之后是否可以作为字符数组进行访问T.我需要 …

c++ placement-new undefined-behavior language-lawyer

7
推荐指数
1
解决办法
157
查看次数

专门为模板类中的嵌套类使用std :: hash

我有一个Baz包含嵌套类的模板类Sub.我想通过专门化std :: hash为这个子类定义一个哈希函数.但是,它似乎不起作用.

#include <functional>

struct Foo {
    struct Sub {
    };
};

template <class T>
struct Bar {
};

template <class T>
struct Baz {
    struct Sub {
        int x;
    };
};

// declare hash for Foo::Sub - all right
namespace std {
    template <>
    struct hash< Foo::Sub >;
}

// declare hash for Bar<T> - all right
namespace std {
    template <class T>
    struct hash< Bar<T> >;
}

// declare hash function for Baz<T>::Sub …
Run Code Online (Sandbox Code Playgroud)

c++ hash templates nested stdhash

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

C++返回对临时对象的引用或将它们存储在对象中

考虑以下代码处理const引用:

const int & func (const int &x)
{
    return x;
}

struct Foo {
    Foo (const int &x)
    : m_x(x) {}

    const int & getX ()
    { return m_x; }

    const int &m_x;
};
Run Code Online (Sandbox Code Playgroud)

我想知道现在允许以下哪些内容(如果有的话):

int x = func(int(7));
int y = Foo(int(7)).getX();
Run Code Online (Sandbox Code Playgroud)

是否保证临时int对象在赋值使用之前仍然存在或getX

更新:所以看起来这是安全的 - 但为什么呢?

  1. 是因为temporaries递归地绑定到const引用并保证存在,只要它们的绑定引用存在?
  2. 或者是因为它们保证在完整表达的持续时间内存在?

考虑存储指针而不是引用的边缘情况:

struct Foo {
    Foo (const int &x)
    : m_x(&x) {}

    const int & getX ()
    { return *m_x; }

    const int *m_x;
};

int …
Run Code Online (Sandbox Code Playgroud)

c++ return reference temporary

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

Rust 中带有回调的事件驱动设计

我想知道如何在 Rust 中使用带有回调的可组合事件驱动设计。根据我现有的实验,我开始怀疑 Rust 中的所有权系统更适合自上而下的过程代码,并且在事件驱动设计中回调所需的父对象的引用方面存在问题。

本质上,我希望看到以下 C++ 代码的 Rust 等效项。该代码实现了一个使用繁忙循环调度 Timer 事件的 EventLoop、一个带有 timer_expired 回调的 Timer 类以及一个以 500 毫秒为间隔调度计时器的 User 类。

#include <stdio.h>
#include <assert.h>
#include <list>
#include <chrono>
#include <algorithm>

using namespace std::chrono;

// Wrapping code in System class so we can implement all functions within classes declarations...
template <typename Dummy=void>
struct System {
    class Timer;

    class EventLoop {
        friend class Timer;

    private:
        std::list<Timer *> m_running_timers;
        bool m_iterating_timers;
        typename std::list<Timer *>::iterator m_current_timer;

        void unlink_timer (Timer *timer)
        {
            auto it …
Run Code Online (Sandbox Code Playgroud)

callback event-driven rust

5
推荐指数
0
解决办法
4163
查看次数

如何检查Cortex M3中是否启用了中断?

在Cortex M3上,一段代码如何确定是否启用了中断,即I程序状态寄存器中的位状态(由cpsid和操纵cpsie)?在较旧的ARM上,我能够读取cpsr寄存器,但似乎不再可能.

我需要这些信息,因为我有一个从main和中断调用的函数,它需要以原子方式执行某个操作,而中断则被禁用.实质上:

bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
    __disable_irq();
}
Critical Code;
if (interrupts_enabled) {
    __enable_irq();
}
Run Code Online (Sandbox Code Playgroud)

另外,我想知道I执行中断时标志的行为.执行中断是否会设置I标志,以防止嵌套?默认情况下是否启用了中断嵌套,如何防止嵌套?

embedded assembly arm interrupt cortex-m3

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