在另一个帖子中,我被告知在速度和紧凑性方面switch可能比查找表更好.
所以我想了解这个之间的区别:
static void func1(){}
static void func2(){}
typedef enum
{
FUNC1,
FUNC2,
FUNC_COUNT
} state_e;
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
};
void fsm(state_e state)
{
if (state < FUNC_COUNT)
lookUpTable[state]();
else
;// Error handling
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
static void func1(){}
static void func2(){}
void fsm(int state)
{
switch(state)
{
case FUNC1: func1(); break;
case FUNC2: func2(); break;
default: ;// Error handling
}
}
Run Code Online (Sandbox Code Playgroud)
我认为查找表更快,因为编译器尝试在可能的情况下将switch语句转换为跳转表.既然这可能是错的,我想知道为什么!
谢谢你的帮助!
我正在使用minGW在Windows上使用C++进行开发.我现在有调试问题.
我必须使用旧版本的GCC(4.4).所以我只是想知道是否可以使用这个旧的GCC进行编译并使用新的GDB进行调试?
他们俩之间有什么联系?
(关于调试器崩溃的任何指针也会非常感激!我只知道我需要确保使用调试DLL)
所以我有一个struct:
typedef struct myStruct
{
const int *const array_ptr;
} myStruct_s;
Run Code Online (Sandbox Code Playgroud)
我有一个const数组int:
const int constArray[SIZE1] =
{
[0] = 0,
[1] = 1,
[2] = 2,
//...
};
Run Code Online (Sandbox Code Playgroud)
现在我有一个使用指定的初始化器初始化的const数组myStruct_s:
const myStruct_s structArray[SIZE2] =
{
[0] =
{
.array_ptr = &constArray
},
//...
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
类型为"const int(*)[SIZE1]"的值不能用于初始化"const int*const"类型的实体
如何正确初始化此指针?
我想避免:
const myStruct_s structArray[SIZE2] =
{
[0] =
{
.array_ptr = (const int *const) &constArray
},
//...
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,因为我觉得我告诉编译器"我不知道我在做什么,请不要检查类型"...
谢谢你的帮助 :).
我正在尝试设置我的cygwin环境.由于我是vim用户,我想在cygwin和windows上轻松使用它.
我首先关心的是在两者之间共享配置(.vimrc/_vimrc和.vim/_vimfiles). 实际上,我最近在github上托管我的vim配置,并尝试通过github更新我的插件.
所以我做了一些谷歌搜索找到最好的方法,但我没有找到一个"好的解决方案"(虽然不容易定义......).无论如何,很多人似乎同意这样一个事实,即最好使用windows-gvim而不是cygwin-gvim(由于X问题我没能使用cygwin-gvim,但我不想再看了).所以第一个问题:这是真的吗?!
然后我试着找到一些基于windows-gvim的解决方案.目前,我已将win env链接起来.在cyg环境中:
.vim -> /cygdrive/d/Program Files/Vim/vimfiles/
.vimrc -> /cygdrive/d/Program Files/Vim/_vimrc
Run Code Online (Sandbox Code Playgroud)
但是当我从cygwin打开gvim时它失败了.我认为win-gvim无法读取cygwin的simlinks.
我试图链接vimfiles目录(所以获胜方),但他们win-gvim也找不到任何东西! 我在这里不明白的是为什么从cygwin发起的win-gvim会查看我的cygwin主目录中的文件?!
我读过可以在windows中声明一个HOME变量来帮助win-vim,但我担心它会产生副作用......
这就是配置配置... 有人有解决方案吗?
另外,为了启动gvim,我使用了一个别名来转换winpaths中的cigpaths的函数:
winfilepath () {
# Extract command
cmd="$1"
shift
# Computes file paths
allfiles=""
if [[ ! -z "$@" ]]; then
while read f
do
newpath=`cygpath -w $f`
allfiles="$allfiles $newpath"
done < <(echo "$@" )
fi
# Launch command
echo "winfilepath: "$cmd $allfiles
$cmd $allfiles
}
alias gvim="winfilepath gvim \"$@\""
alias gvimdiff="winfilepath gvimdiff \"$@\""
# Open Windows explorer …Run Code Online (Sandbox Code Playgroud) 我正在家里学习c ++而且我正在使用rapidxml lib.我正在使用它提供的utils来打开文件:
rapidxml::file<char> myfile (&filechars[0]);
Run Code Online (Sandbox Code Playgroud)
我注意到如果filechars错误则rapidxml::file抛出一个runtime_error:
// Open stream
basic_ifstream<Ch> stream(filename, ios::binary);
if (!stream)
throw runtime_error(string("cannot open file ") + filename);
stream.unsetf(ios::skipws);
Run Code Online (Sandbox Code Playgroud)
我想我需要写一些类似的东西:
try
{
rapidxml::file<char> GpxFile (pcharfilename);
}
catch ???
{
???
}
Run Code Online (Sandbox Code Playgroud)
我做了一些谷歌搜索,但我找不到我需要的地方???.
有人能帮帮我吗?谢谢!
我最近写了一段像这样的C代码:
static void func1()
{
}
static void func2()
{
}
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
Run Code Online (Sandbox Code Playgroud)
另一个程序员在同一个文件上工作并将其更改为:
static void func1();
static void func2();
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
static void func1()
{
}
static void func2()
{
}
Run Code Online (Sandbox Code Playgroud)
由于funcN函数只通过查询表调用,我实际上并不需要这些函数的声明.
这是一个品味问题,还是一种被认为是好/坏做法的编码风格?
谢谢你的回答!
在我的应用程序中,我有一个用于伪单元测试的构建配置(这更像是一种手动调试专用功能)。
在这些单元测试中,我想访问static在其翻译单元中声明的函数。
是否有 GCC 选项可以让我static从任何地方调用函数?
我想避免:
#if UNIT_TEST_MODE
void myfunction(void)
#else
static void myfunction(void)
#end
{
// body
}
Run Code Online (Sandbox Code Playgroud)
到处!
谢谢你的帮助 :)。
我正在使用lambda函数进行tkinter的GUI编程.最近我在实现打开文件的按钮时遇到困难:
self.file=""
button = Button(conf_f, text="Tools opt.",
command=lambda: tktb.helpers.openfile(self.file))
Run Code Online (Sandbox Code Playgroud)
如您所见,我想定义一个可以更新的文件路径,并且在创建GUI时不知道.我遇到的问题是我之前的代码是:
button = Button(conf_f, text="Tools opt.",
command=lambda f=self.file: tktb.helpers.openfile(f))
Run Code Online (Sandbox Code Playgroud)
lambda函数有一个关键字参数来传递文件路径.在这种情况下,参数f在何时没有更新self.file.
我从代码片段中获取了关键字参数,并且我在任何地方都使用它.显然我不应该......
这对我来说仍然不清楚......有人可以解释一下这两种lambda形式之间的区别以及何时使用另一种形式?
谢谢!
PS:以下评论让我得到了解决方案,但我想要一些解释: lambda与tkinter奇怪地合作
我开始使用doxygen来生成我的Python代码的文档.我使用doxypyfilter来预处理Python文档字符串.我的目标是在Python中有一个很好的语法突出显示doxygen注释.
当写我的炫魅在专用.dox文件,我发现doxygen的注释中可以突出VIM使用下面的命令:
set syntax=c.doxygen
Run Code Online (Sandbox Code Playgroud)
我为Python尝试了相同的命令,但我什么都没得到:set syntax = python.doxygen
我也做了一些谷歌搜索,找不到任何有趣的东西
这是我要强调的一段典型代码:
class CompilationTab:
"""
The compilation tab of the verif GUI. It contains the layout description
and the functions required to deal with specific behaviors of the tab
"""
def __init__(self, notebook, tab_name):
"""
The class constructor.
@param notebook Notebook: The parent @c Notebook widget
@param tab_name String: The display name of the tab
"""
Run Code Online (Sandbox Code Playgroud)
有人已经解决了这个问题吗?谢谢你的帮助!
基本上,我只想知道手动热编码C FSM的状态是否是个好主意.我实现了这个来编写一个简单的状态转换验证器:
typedef enum
{
FSM_State1 = (1 << 0),
FSM_State2 = (1 << 1),
FSM_State3 = (1 << 2),
FSM_StateError = (1 << 3)
} states_t;
Run Code Online (Sandbox Code Playgroud)
然后验证:
states_t nextState, requestedState;
uint32_t validDestStates = 0;
// Compute requested state
requestedState = FSM_State1;
// Define valid transitions
validDestStates |= FSM_State2;
validDestStates |= FSM_State3;
// Check transition
if (validDestStates & requestedState)
{
// Valid transition
nextState = requestedState;
}
else
{
// Illegal transition
nextState = FSM_StateError;
}
Run Code Online (Sandbox Code Playgroud)
我知道我被限制为可以使用的最大整数大小.但我没有那么多州.所以这不是问题
有没有比这种编码更好的东西?有什么缺点我还没看到吗?
谢谢你的帮助!
编辑:根据user3386109评论更改验证测试 …
我正在使用rapidxml lib.它定义了一个以这种方式解析文件的函数:
template<int Flags>
void parse(Ch *text)
Run Code Online (Sandbox Code Playgroud)
lib提供了const int标志,例如:
const int parse_declaration_node = 0x20;
Run Code Online (Sandbox Code Playgroud)
所以我在我的类中创建了一个指向静态int的指针:
const int * parser_mode;
Run Code Online (Sandbox Code Playgroud)
在类构造函数中,我为它赋值:
parser_mode = &rapidxml::parse_declaration_node;
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试将此const int *作为模板参数用于解析函数时:
tree->parse<parser_mode>(file->data());
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
错误:'GpxSectionData :: parser_mode'不能出现在常量表达式中
这句话的其余部分似乎是正确的,因为:
tree->parse<0>(file->data());
Run Code Online (Sandbox Code Playgroud)
不会产生编译错误......
你能告诉我我在这里失踪了吗?谢谢!
感谢下面的解释,我可能会在课堂上定义:所以我认为这是:
class Myclass {
static const int parser_mode;
[...]
}
static const int Myclass::parser_mode = rapidxml::parse_declaration_node;
Run Code Online (Sandbox Code Playgroud) 我的C编译器的标准库定义了NULL这种方式:
#define NULL 0
Run Code Online (Sandbox Code Playgroud)
我希望:
#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)
有人能告诉我哪一个是正确的,为什么?
谢谢!