C和C++中的数字pi存在一个相当愚蠢的问题.据我知道M_PI的定义math.h是没有任何标准要求.
新的C++标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermite以及std::cyl_bessel_i不同的随机数生成器等等.
是否有任何"新"标准为pi带来了一个常数?如果没有 - 为什么?没有它,所有这些复杂的数学如何运作?
我知道关于C++中pi的类似问题(它们已经有几年了,而且标准已经很久了); 我想知道问题的当前状态.
我也非常感兴趣为什么 C++仍然没有pi常量,但有很多更复杂的数学.
UPD:我知道我可以将自己定义为4*atan(1)或acos(1)或double pi = 3.14.当然.但为什么在2018年我仍然必须这样做?没有pi,标准数学函数如何工作?
我知道这个问题已经被问过好几次了,但是我找不到针对这种情况的答案。
假设我有一个琐碎的类,它不拥有任何资源,并且具有空的析构函数和默认构造函数。它具有少数带有类内初始化的成员变量;没有一个是const。
我想重新初始化和此类对象,而无需deInit手动编写方法。这样做是否安全?
void A::deInit()
{
new (this)A{};
}
Run Code Online (Sandbox Code Playgroud)
我看不到任何问题-对象始终处于有效状态,this仍然指向同一地址;但是它是C ++,所以我想确定。
我在生成HID描述符时遇到了一些问题.我想使用ID1作为输入的简单报告,使用ID2作为64字节数据的输出.
我意识到尽管rtfming和谷歌搜索我仍然没有关于HID描述符中的一些字段的线索.
有人可以给我一个提示或手册,我可以找到所有描述符字段的含义吗?我所能找到的只是HID-mouse/joistick/keyboard的例子.
例如 - REPORT_SIZE - 是以字节还是以位为单位的大小?为什么还有REPORT_COUNT?如果报告中有64个字节,LOGICAL_MAXIMUM必须是255或255*64?
我应该为每个报告写LOGICAL_MAX和MIN吗?
或者这个(通过猜测生成)就足够了?
char ReportDescriptor[39] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x40, // REPORT_SIZE (64)
0x96, 0x00, 0x02, // REPORT_COUNT (512)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // …Run Code Online (Sandbox Code Playgroud) 我已经见过Vec<_>几次了.例如:
let a = "line1\r\nline2\nline3";
println!("{:?}", a.lines().collect::<Vec<_>>());
Run Code Online (Sandbox Code Playgroud)
但那个"不确定的面孔" <_>是什么意思呢?
我已习惯尖括号中的类型名称,但这可以是什么类型?我所知道的下划线的唯一含义是来自Python作为未使用变量的名称.
我在IntelliJ中创建了一个简单的Java项目,一个类(RandomizedQueue)并为它生成了JUnit测试类.所以它只是两个文件,它们都在同一个目录中--src.
编译的一切都很好.一段时间 然后突然 - 它停止了这个错误:
java: cannot find symbol
symbol: class RandomizedQueue
location: class RandomizedQueueTest
Run Code Online (Sandbox Code Playgroud)
我尝试了我能想到的一切.重新创建项目已经工作了一段时间,但同样的错误再次出现(没有任何明显的原因).我在这里找不到任何逻辑!从cmd编译确实有效.
我尝试从类和测试中删除所有内容 - 我仍然无法在测试方法中创建实例.
我熟悉GCC和Keil的警告抑制pragma(它们不同,但用法几乎相同).对于第三方标题,我可以这样做:
#pragma push
#pragma suppress warning
#include "whatever.h"
#pragma pop
Run Code Online (Sandbox Code Playgroud)
但是,如何抑制来自第三方来源的警告?Eclipse + GCC和Keil都会生成它们.我提出的唯一解决方案是制作whapper .c文件,其中包含其他.c文件,这似乎是非常脏的技巧.
还有其他解决方案吗?
也许我不正确理解C++或者它是编译器的错误?
uint8_t a = 0x00;
uint8_t b = 0xFF;
if( a - b == 1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
doNothing未被调用(如预期的那样),因为(ab)的结果在比较操作中被隐式地转换为第二个操作数的类型.对于数字,它是签名int.好的.
if( a - b == (uint8_t)1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
doNothing STILL没有被调用,但现在我不明白它的原因!我已经明确地将数字转换为uint8!
if( (uint8_t)(a - b) == 1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
现在doNothing终于被召唤了,但为什么呢?如何减去两个uint8返回一个int?
编译器是用于ARM Cortex M3的uVision ARMCC.
C++ 11使我们能够创建具有非平凡成员的匿名联合.这有时非常有用 - 例如,如果我想为没有默认ctor的某些非平凡对象创建Holder类.
让我们通过给它一个虚拟方法让这个NonTrivial对象更有趣:
#include <stdint.h>
#include <stdio.h>
struct Base
{
virtual void something() { printf("something\n"); }
};
struct NonTrivial : Base
{
explicit NonTrivial( int ) : a(1), b(2), c(3), d(4) { printf("NonTrivial\n"); }
virtual void something() override { printf("something non trivial\n"); }
int a;
int b;
int c;
int d;
};
struct Holder
{
Holder() : isNonTrivial(false), dummy(0x77) {}
Holder( NonTrivial n) : isNonTrivial(true), nonTrivial( n ) {}
bool isNonTrivial;
union
{
int dummy;
NonTrivial nonTrivial;
}; …Run Code Online (Sandbox Code Playgroud) assert!(a == b)比assert_eq!(a, b)我更少的字符,在我看来,更具可读性.
错误消息或多或少相同:
thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `2`)', src\main.rs:41
Run Code Online (Sandbox Code Playgroud)
要么
thread 'main' panicked at 'assertion failed: 1 == 2', src\main.rs:41
Run Code Online (Sandbox Code Playgroud)
实际上,这个问题不仅仅是关于Rust; 我一直在单元测试框架中看到这些不同的断言宏或函数:
CHECK与CHECK_FALSE和CHECK_EQUAL等;EXPECT_GT和EXPECT_EQ等;assertEquals和assertFalse做的.通常还有一些特定类型的断言,如字符串或数组.重点是什么?