我有以下语法:
grammar tryout;
tryout : my_cmd
;
my_cmd
: 'start' '0'..'9'+ Name_string
;
Digit
: '0'..'9'
;
Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;
Run Code Online (Sandbox Code Playgroud)
如果我在ANTLRworks中看到图表,'0'..'9'+显示为空元素,因此Java代码编译失败,因为生成的代码具有"if()"语句; 如果我在命令行运行,编译也会失败.
修复是将'0'..'9'+移动到词法分析器规则.
grammar tryout;
tryout : my_cmd
;
my_cmd
: 'start' Digit+ Name_string
;
Digit
: '0'..'9'
;
Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;
Run Code Online (Sandbox Code Playgroud)
但我想知道这是不是一个错误.为什么range元素不能用于解析器规则?这是在ANTLR v3.4上.
我查看了 FIX v4.2 规范,我不清楚当 TCP 连接在会话中间丢失时应该是什么预期行为。
更具体地说,假设当前的序列号是 100 并且此时 TCP 连接丢失,当任何一方尝试恢复会话时,它重新发送消息号 100,或者启动一个新的登录会话?
在描述 FIX 会话时,规范说一个会话有一个登录和一个注销,但可以跨越多个物理连接。这让我认为当 TCP 连接丢失时,恢复过程不应该以登录消息开始,但我对此并不乐观。
提前致谢!
我有兴趣尝试 GPU 编程。我不清楚的一件事是,我需要什么硬件?有没有带显卡的电脑好?我对 GPU 编程知之甚少,因此入门学习曲线最好不要陡峭。如果因为我的硬件不够好而不得不为了运行一些教程而进行大量黑客攻击,我宁愿购买新硬件。
我有一台安装了 Ubuntu Linux 的退役 PC(约 10 年),我不确定它有什么显卡,一定是旧的。
我还计划购买一个低于 500 美元的新台式机,我的休闲研究通常有 AMD Radeon 7x 或 Nvidia GT 6x 显卡。我认为任何新 PC 都足以用于编程学习。
无论如何,任何建议表示赞赏。
你明白为什么static_assert失败了:
template <typename T>
void
foo(const T &c)
{
static_assert(std::is_base_of<T, char>::value, "T must be char"); // Fails !
}
int main()
{
char c = 'a';
foo<char>(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我交换了T和"char",仍然失败了.
我在这里问了相关问题.现在它有点微妙.
这是代码:
class MyClass {
public:
const vector<unique_ptr<MyObject> >& get_const_objs() const;
private:
vector<unique_ptr<MyObject>> m_objs;
};
Run Code Online (Sandbox Code Playgroud)
我的意图是来自get_const_objs()的返回向量是只读的,但问题是因为向量的元素不是const,所以调用者仍然可以更改单个元素,例如
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
Run Code Online (Sandbox Code Playgroud)
我的解决方案是将const插入向量:
const vector<const unique_ptr<MyObject> >& get_const_objs() const;
Run Code Online (Sandbox Code Playgroud)
但是这导致了一个无聊的get_const_objs()实现,我将每个元素复制到一个新的向量:
const vector<const unique_ptr<MyObjects>>& MyClass::get_const_objs() const
{
vector<const unique_ptr<MyObjects>> ret;
for (const auto &obj : my_objs) {
ret.push_back(obj);
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
是的,我可以在MyClass中添加迭代器接口.还有其他解决方案吗?
我有一个限制:BOOST不可用.但我喜欢知道BOOST解决方案,如果确实有一个好的只是使用标准.
我在 ubuntu、GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 上使用 gdb 7.7.1。
我的终端是 Konsole 2.13.2。
我遇到的问题是,当我进入 TUI 模式时,经过一两个调试器会话 - 会话,我的意思是,设置断点,运行,跳过一段时间,最后通过“kill”命令杀死它 - 输出开始混乱向上。据说每个输出都应该换到一个新的行,但现在他们都在争抢,一个接一个。
我附上截图。
我必须退出 GDB,打开一个新的终端选项卡并再次启动 gdb。
我来回尝试了“ctrl-xa”,没有帮助;“ctrl-l”也没有。
不久前,我正在使用另一个终端,它也有这个问题。
任何帮助表示赞赏。
我正在使用最新的gtest。以下代码编译失败:
Error_code rc = some_function();
ASSERT_EQ(OK, rc);
Run Code Online (Sandbox Code Playgroud)
Error_code 是一个枚举 typedef:
typedef enum {
OK = 0,
Warning,
Error
} Error_code;
Run Code Online (Sandbox Code Playgroud)
错误消息没有意义:
Downloads/gtest-1.7.0/unzipped/include/gtest/internal/gtest-internal.h:1026:5: error: could not convert ‘testing::internal::AssertHelper((testing::TestPartResult::Type)2u, ((const char*)"source/unit_test/test.cpp"), 182, gtest_ar.testing::AssertionResult::failure_message()).testing::internal::AssertHelper::operator=((*(const testing::Message*)(& testing::Message())))’ from ‘void’ to ‘std::vector<Ttype>’
= ::testing::Message()
^
Downloads/gtest-1.7.0/unzipped/include/gtest/internal/gtest-internal.h:1029:3: note: in expansion of macro ‘GTEST_MESSAGE_AT_’
GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
^
Downloads/gtest-1.7.0/unzipped/include/gtest/internal/gtest-internal.h:1032:10: note: in expansion of macro ‘GTEST_MESSAGE_’
return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
^
Downloads/gtest-1.7.0/unzipped/include/gtest/gtest_pred_impl.h:80:5: note: in expansion of macro ‘GTEST_FATAL_FAILURE_’
on_failure(gtest_ar.failure_message())
^
Downloads/gtest-1.7.0/unzipped/include/gtest/gtest_pred_impl.h:147:3: note: in expansion of macro ‘GTEST_ASSERT_’
GTEST_ASSERT_(pred_format(#v1, …Run Code Online (Sandbox Code Playgroud) 当前的Makefile有这样的东西:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a:
$(MAKE) -C sub_dir all
Run Code Online (Sandbox Code Playgroud)
我想更改这个Makefile,以便在目标所依赖的任何地方lib1.a,它总是运行命令" $(MAKE) -C sub_dir all".换句话说,在上面的例子中,target1和target2将始终运行" $(MAKE) -C sub_dir all".有什么方法可以做到吗?
我知道以下不起作用:
target1 : lib2.a
$(MAKE) -C sub_dir all
target2 : lib3.a
$(MAKE) -C sub_dir all
target3 : lib3.a
Run Code Online (Sandbox Code Playgroud)
因为如果lib2.a没有更新,则该命令不会运行.我有一个限制,我只控制lib1.a,我无法改变lib2.a的构建方式.
任何帮助表示赞赏!
[ 更新 ]我最终得到了以下解决方案:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a: relay
.PHONY: relay
relay:
$(MAKE) -C sub_dir all
Run Code Online (Sandbox Code Playgroud)
嗨Etan,您指出的GNU帮助说FORCE不如.PHONY效率高,但从您的解释来看,在我看来FORCE更好.我误解了吗?你能评论我的解决方案吗?
我正在编写一个 C 函数,它将 PyObject* 作为参数并根据数据类型对其进行处理。例如,如果它是一个字符串、一个整数、一个双精度值、一个列表等。
我正在寻找检查数据类型的方法,你能给我举一些例子吗?
我正在使用 CPython 3.8。
我遇到了这样的C++代码:
T& T::operator=(const T&t)
{
...
new (this) T(t);
...
}
Run Code Online (Sandbox Code Playgroud)
这条线对我来说太陌生了:new (this) T(t);
我可以看到它正在调用复制构造函数来填充"this",但不知怎的,我只是无法理解语法.猜猜我已经习惯了this = new T(t);
你能救我吗?