小编Plo*_*uff的帖子

查找表与C嵌入式软件中的切换

在另一个帖子中,我被告知在速度和紧凑性方面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语句转换为跳转表.既然这可能是错的,我想知道为什么!

谢谢你的帮助!

c embedded performance lookup-tables switch-statement

35
推荐指数
3
解决办法
7274
查看次数

C++:我是否需要使用相同版本的GCC和GDB进行调试

我正在使用minGW在Windows上使用C++进行开发.我现在有调试问题.

我必须使用旧版本的GCC(4.4).所以我只是想知道是否可以使用这个旧的GCC进行编译并使用新的GDB进行调试?

他们俩之间有什么联系?

(关于调试器崩溃的任何指针也会非常感激!我只知道我需要确保使用调试DLL)

c++ debugging gcc gdb

8
推荐指数
1
解决办法
3751
查看次数

如何正确初始化const int const*变量?

所以我有一个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)

如果可能的话,因为我觉得我告诉编译器"我不知道我在做什么,请不要检查类型"...

谢谢你的帮助 :).

c arrays pointers initialization const

8
推荐指数
1
解决办法
802
查看次数

在cygwin-vim和windows-gvim之间共享vim配置并启动它的最佳方法

我正在尝试设置我的cygwin环境.由于我是vim用户,我想在cygwin和windows上轻松使用它.

共享vim配置

我首先关心的是在两者之间共享配置(.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,但我担心它会产生副作用......

这就是配置配置... 有人有解决方案吗?

启动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)

windows vim configuration cygwin

6
推荐指数
2
解决办法
3079
查看次数

c ++:Catch runtime_error

我正在家里学习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++ runtime-error exception

6
推荐指数
2
解决办法
2万
查看次数

我是否应该认为声明所有C静态函数是一个很好的实践?

我最近写了一段像这样的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函数只通过查询表调用,我实际上并不需要这些函数的声明.

这是一个品味问题,还是一种被认为是好/坏做法的编码风格?

谢谢你的回答!

c declaration lookup-tables

5
推荐指数
1
解决办法
161
查看次数

GCC 可以忽略函数的静态声明吗?

在我的应用程序中,我有一个用于伪单元测试的构建配置(这更像是一种手动调试专用功能)。

在这些单元测试中,我想访问static在其翻译单元中声明的函数。

是否有 GCC 选项可以让我static从任何地方调用函数?

我想避免:

#if UNIT_TEST_MODE
void myfunction(void)
#else
static void myfunction(void)
#end
{
    // body
}
Run Code Online (Sandbox Code Playgroud)

到处!

谢谢你的帮助 :)。

c gcc unit-testing

5
推荐指数
2
解决办法
1446
查看次数

Python:有和没有关键字参数的lambda函数行为?

我正在使用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奇怪地合作

python lambda tkinter

4
推荐指数
1
解决办法
4474
查看次数

在Python中使用doxygen样式文档字符串的Vim语法高亮显示

我开始使用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)

有人已经解决了这个问题吗?谢谢你的帮助!

python vim doxygen syntax-highlighting

4
推荐指数
1
解决办法
1549
查看次数

C FSM状态的一种热编码

基本上,我只想知道手动热编码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评论更改验证测试 …

c state state-machine

3
推荐指数
1
解决办法
339
查看次数

c ++:将const int传递给模板函数

我正在使用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++ templates const

1
推荐指数
1
解决办法
1530
查看次数

我的编译器std lib将NULL定义为0:它是否正确?

我的C编译器的标准库定义了NULL这种方式:

#define NULL 0
Run Code Online (Sandbox Code Playgroud)

我希望:

#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)

有人能告诉我哪一个是正确的,为什么?

谢谢!

c null

1
推荐指数
1
解决办法
80
查看次数