我只是想知道是否有人知道在互联网上开发状态机的一些很好的教程.还是电子书?
我开始在状态机上工作,只需要一些通用的东西让我开始.
目前我正在开发一个使用goto语句的项目.goto语句的主要目的是在例程中使用一个清理部分而不是多个return语句.如下所示:
BOOL foo()
{
BOOL bRetVal = FALSE;
int *p = NULL;
p = new int;
if (p == NULL)
{
cout<<" OOM \n";
goto Exit;
}
// Lot of code...
Exit:
if(p)
{
delete p;
p = NULL;
}
return bRetVal;
}
Run Code Online (Sandbox Code Playgroud)
这使得我们可以更容易地跟踪代码中一个部分的清理代码,即在Exit标签之后.
但是,我已经阅读了许多地方,有goto语句是不好的做法.
目前我正在阅读Code Complete书,它说我们需要使用接近其声明的变量.如果我们使用goto,那么我们需要在第一次使用goto之前声明/初始化所有变量,否则编译器会给出goto语句跳过xx变量初始化的错误.
哪条路对不对?
来自Scott的评论:
看起来使用goto从一个部分跳转到另一个部分是不好的,因为它使代码难以阅读和理解.
但是如果我们只使用goto前进到一个标签那么它应该没问题(?).
可能重复:
在C中有效使用goto进行错误管理?
最近我遇到过这样的C代码:
if( !condition1){
goto failure;
}
some_stuff_that_needs_manual_undoing();
if( !condition2){
goto failure;
}
// And many more lines such as the ones above
return 0;
failure:
// Do a lot of stuff here, free, file closing and so on
return -1;
Run Code Online (Sandbox Code Playgroud)
总结一下情况:
我有一个很长的函数,连续做几件事(让我们说打开一个文件,然后根据文件内容分配内存,然后连接do数据库等等).当然我想正确地释放资源,但是有很多地方可能会导致功能过早结束(而且所有这些都需要清理).
问题:如何正确地做到这一点?
虽然goto 似乎不是那么糟糕的做法,但它似乎也不是一个好的解决方案.
我虽然遵循:
#define CLEANUP if( memory != NULL)free(memory); \
if( fp != NULL) fclose(fp);\
// ...
if( !condition1){
CLEANUP
return -1;
}
if( !condition2){
CLEANUP
return -2;
} …Run Code Online (Sandbox Code Playgroud) 我写了一个程序来查找字符串中最长的单词并打印最长单词中的字母数.但代码不是打印.我多次分析了该程序,但我找不到解决方案.
#include <stdio.h>
#include <string.h>
int main() {
char string[100] = "Hello Kurnool";
int i = 0, letters = 0, longest = 0;
start:
for (; string[i] !=' '; i++) {
letters++;
}
if (letters >= longest)
longest = letters;
if (string[i] == ' ') {
letters = 0;
i++;
goto start;
}
printf("%d", longest);
return 0;
}
Run Code Online (Sandbox Code Playgroud)