我可以启动 VS Code 以使用code /path/to/folder
. 是否可以通过在命令行上指定计算机和文件夹来打开远程计算机上的文件夹(通过远程 SSH 扩展)?
在C++中是否有任何编译时库(模板元编程)用于任意精度算术?
我需要这个来帮助我的AVR微控制器程序中的定点算术和二进制缩放.例如,当两个数字各自具有自己的边界时,bignums将用于计算结果的边界,并在适当时移动输入和/或输出中的分数点.但是结果的边界可能无法在标准整数类型中表示.
c++ fixed-point bignum compile-time template-meta-programming
在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
有一些特殊的作用.用其他内置数学函数替换它,例如sqrt
或pow
解决错误.所以看起来__builtin_round
只是缺乏constexpr支持.但...value()
被文字替换1.23
,那也会删除错误.__builtin_sqrt
仅删除,只__builtin_round(value())
删除错误.我想知道为什么round
会以这种方式表现,如果有任何解决方法.
注意.我知道内置的数学函数及其constexpr-ness是非标准的编译器特有的功能.请不要告诉我如何不使用它,或者我不应该如何编写时间数学.在我的情况下,有constexpr数学是一个重要的功能,我很好依赖于G ++.
我从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) 我正在尝试在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模式没有这个问题,在我的情况下是可以接受的.我已经尝试过并确认它适用于零占空比和全占空比.
我需要将一种转换std::chrono::duration
为另一种,但我需要知道何时无法进行这种转换,因为该值无法表示.
我没有在标准库中找到任何设施来检查这一点.该cppreference页面没有指定值是否超出范围会发生什么,只能从浮点到整数的转换可能是不确定的行为(在我来说,我需要从整数转换为整数).
让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
.我需要 …我有一个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) 考虑以下代码处理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
?
更新:所以看起来这是安全的 - 但为什么呢?
考虑存储指针而不是引用的边缘情况:
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) 我想知道如何在 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) 在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
标志,以防止嵌套?默认情况下是否启用了中断嵌套,如何防止嵌套?
c++ ×7
embedded ×2
arm ×1
assembly ×1
atmel ×1
avr ×1
bignum ×1
built-in ×1
c++-chrono ×1
callback ×1
class ×1
compile-time ×1
compiler-bug ×1
constexpr ×1
cortex-m3 ×1
event-driven ×1
fixed-point ×1
g++ ×1
g++4.8 ×1
hash ×1
interrupt ×1
nested ×1
private ×1
pwm ×1
reference ×1
return ×1
rust ×1
stdhash ×1
templates ×1
temporary ×1