Win7 64-bit
gcc 4.8.2
g++ -Wall
Run Code Online (Sandbox Code Playgroud)
我尝试格式化我的C++ sscanf,如为什么scanf()需要"%lf"为双打,当printf()只用"%f"时可以吗?但是回报是x == 0.程序如下.我无法弄清楚我做错了什么,所以欢迎任何建议.
# include <stdio.h>
# include <ios>
# include <iostream>
# include <iomanip>
#include <cstdlib>
using namespace std;
int main(int argc, char** argv) {
char buffer[30];
double x = 5.0;
sprintf(buffer, "%a", 1.2);
sscanf(buffer, "%la", &x);
cout << " Example 1.2 buffer -> " << buffer << endl;
cout << " Example 1.2 scanf <- " << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
Example 1.2 buffer -> 0x1.3333333333333p+0 …Run Code Online (Sandbox Code Playgroud) Fortran具有计算效率,称为"计算goto".该构造使用分支表中的索引来执行直接转到.如果我没记错的语法是:
go to index (label1, label2, ...)
Run Code Online (Sandbox Code Playgroud)
其中索引用于引用括号列表中的代码指针(标签).
我有一个案例,计算goto是一个比switch语句更好的解决方案,并希望构建一个,但无法弄清楚如何.
现在在jibes和slings到来之前,编译器可以优化计算的goto,但我不能保证它会.
始终可以使用switch语句.在某些情况下,可以将switch语句优化为跳转表(计算goto的实现).但是,这只有在案例值的范围几乎是密集覆盖时才有可能(在低值到高值的范围内,每个整数几乎都有一个case语句).如果不是这种情况,则实现可能是二叉树.编译器编写器可以选择在适当的时候优化跳转表.在二叉树总是满足switch语句的语义的情况下,有时跳转表就足够了,让我问一下我是否可以在适当的时候保证跳转表.我无法控制编译器编写器.
作为一个简单的例子,我经常写词法分析器(FSM),我使用三个数据结构,一个用于将输入映射到可接受的字母表,一个用于执行节点转换,一个用于根据当前状态和输入执行一些代码值.FSM的实现是Mealy机器,而不是Moore机器,因此动作是在弧(转换)上执行而不是在节点上执行.
执行的操作通常很小,通常不超过一行源代码.我认识到可以使用函数,并且它们的使用消除了对跳转表的需要.但我相信我不能"指向"内联函数,因此,函数是从可调用程序关闭的.在大多数情况下,这比使用跳转表优化的switch语句效率低.如果我可以使用跳转表,那么我就避免了编译器编写者对优化的看法以及能够编写高效代码的问题.
关于与Fortran计算goto相关的问题,下面提到的一般情况.这不是对那些评论的批评.但质量问题,即使它们是真的,也没有回答这个问题.
下面有一个答案void* &&label;,我要感谢你.但是,唉,正如您所指出的那样,这是非标准的C/C++,很可能在将来不存在.所以,最好不要这样做.
我希望我已经回答了"获得更好的编译器"的评论.我希望我至少解决了使用函数指针的问题.最后,这对我来说是一个好奇的时刻.我不认为我应该提供我为什么认为这个问题具有一定的携带能力的杀菌史.但现在我知道了.无论什么时候,我的意思是什么时候,我写信给这个小组,我最好告诉你我所有的鸭子是什么,这样他们就可以被击落.
大家好.
我正在尝试将 C++ flex 与 C++ bison 连接起来,但我被难住了。Bison 3.8.1 手册有一个带有 C Flex 的 C++ Bison 示例。Flex 2.6.4 没有示例。我试图解决的问题是如何向 C++(或 C)Bison 提供指向 C++ Flex 对象的实例指针。我最好的想法是定义YY_DECL要使用的 Flex 扫描器# define YY_DECL bison::symbol_type flx->yylex(),并通过解析器调用序列将 flx 传递到 Bison,重新定义“解析”。这样对吗?还有更好的方法吗?
gcc(GCC)4.5.3
GNU gdb(GDB)7.5.50.20130309-cvs(cygwin-special)
Netbeans 7.3
我在代码中捕获SIGSEGV,Segment Fault Exception时遇到了一些麻烦.try-catch没有捕获它(下面的代码).这是一个不可捕获的例外吗?有没有办法抓住它?(当然)我做错了什么?
艺术
string SlipStringOp::dump(const SlipCell& X) const {
stringstream pretty;
PTR ptr = *getPtr(X);
pretty << "[string ] " << dumpLink(X) << " = "
<< setfill('0') << setw(8) << hex << ptr
<< " -> ";
try {
pretty << ptr->dump();
} catch(exception& e) {
pretty << e.what();
postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
} catch(...) {
postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
}
return pretty.str(); …Run Code Online (Sandbox Code Playgroud) 我宁愿不自己创建语法。我确实下载了一个“语法”,但它是用 ANTLR 或 Yacc 的非标准形式编写的,并且包含词法分析器语句。我需要一些时间将两者分开并为解析器生成器引入正确的语法。
This is perl 5, version 30, subversion 1 (v5.30.1) built for MSWin32-x64-multi-thread
Win10
cygwin
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用 opendir。这是我的示例代码:
sub test($) {
my $dir = shift;
opendir (DIR, $dir) || die "Couldn't open dir $dir $!";
}
sub main() {
my $dir = `pwd`;
test($dir);
}
Run Code Online (Sandbox Code Playgroud)
错误信息
Couldn't open dir /home/skidmarks/Projects/Perl
Invalid argument at ./test.py line .
Run Code Online (Sandbox Code Playgroud)
pwd 返回一个 Unix 格式的目录路径 ('/')。我已经尝试过使用 Windows 格式的目录路径 ('\')。唯一有效的是对路径使用文字字符串,例如“。” 或“some_directory_path”。
我不能在 opendir 中使用变量作为路径吗?
Visual Studio 版本 16.10.3、C++17、Win10-64。
我无法弄清楚这一点。我想我已经把所有流行语都弄对了,但我收到以下代码的错误:
#include <string>
using namespace std;
class AssetID {
private:
string& asset_Name;
public:
const string& getName() { return asset_Name; }
}; // class AssetID
static
bool compareName(const AssetID* lhs, const AssetID* rhs) {
return lhs->getName() < rhs->getName();
};
Run Code Online (Sandbox Code Playgroud)
Code Description Project File Line Suppression State
C2662 'const std::string &AssetID::getName(void)': cannot convert 'this' pointer from 'const AssetID' to 'AssetID &' HOAAnalysis DTest.h 15
C2662 'const std::string &AssetID::getName(void)': cannot convert 'this' pointer from 'const AssetID' to 'AssetID &' …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何推导出仿函数的返回值类型?
给出以下示例:
<type>& operator+(const <type>& rhs) {
// *this.data + rhs
}
Run Code Online (Sandbox Code Playgroud)
如何在<type>类型的对象中返回求和的值?
如果我编码:
<type>& operator+(const <type>& rhs) {
<type> cell;
switch(rhs.type {
case DOUBLE:
{
cell.data = (double)cell.data + (double)rhs.data;
}
return cell;
}
Run Code Online (Sandbox Code Playgroud)
我返回一个临时堆栈值,并收到一条错误消息.
如果我编码:
<type>& operator+(const <type>& rhs) {
*this.data = *this.field + rhs.data;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我覆盖了这不是添加的意图.
这只是一个例子.'真正的'代码要求我能够添加(减去,...)任意数量的输入数据类型,这反过来要求返回值能够容纳几种类型的任何数据,它可以做和做.
编译器gcc 4.5.3(cygwin)
我试图确定在什么条件下为参数调用复制构造函数,我想找到一种方法来传递一个不需要调用复制构造函数的参数.我构建了以下测试代码来探索此问题.
在以下代码中,为fnc1()调用复制构造函数两次.应该多次调用它的任何理由?
有没有办法没有调用复制构造函数?
# include <iostream>
using namespace std;
class able {
public:
long x;
able(): x(1) {}
able(const able&) {cout << " const "; }
~able() { cout << " ~able" << endl; }
};
able fnc1(able x) { cout << "fnc1(able x)" ; return x; }
able fnc2(able& x) { cout << "fnc2(able& x)" ; return x; }
able fnc3(const able& x) { cout << "fnc3(const able& x)" ; return x; }
able fnc4(able const & …Run Code Online (Sandbox Code Playgroud) 鉴于:
my @list1 = ('a');
my @list2 = ('b');
my @list0 = ( \@list1, \@list2 );
Run Code Online (Sandbox Code Playgroud)
然后
my @listRef = $list0[1];
my @list = @$listRef; # works
Run Code Online (Sandbox Code Playgroud)
但
my @list = @$($list0[1]); # gives an error message
Run Code Online (Sandbox Code Playgroud)
我不明白为什么。我错过了什么?