新的gnuplot(5.x)有新的逻辑语法,但是我无法使用'else if'语句。例如:
if(flag==1){
plot sin(x)
}
else{
plot cos(x)
}
确实有效,但是:
if(flag==1){
plot sin(x)
}
else if(flag==2){
plot cos(x)
}
else if(flag==3){
plot tan(x)
}
没有。我尝试了很多{}的组合以及'if'和'else'的位置无济于事。有谁知道如何在gnuplot 5.x中正确实现'else if'?
gnuplot指南(http://www.bersch.net/gnuplot-doc/if.html)没有使用'else if'的新逻辑语法的示例,但确实有使用旧语法的示例,但我宁愿避免旧的。
答案 0 :(得分:3)
基于对最新版本的Gnuplot中command.c
的源代码的简要检查,我会说不支持此功能。更具体地说,相关部分可以在1163
行上找到(见下文)。解析器首先确保if
后跟括在括号中的条件。如果以下标记是{
,则会激活新语法,隔离一对匹配的{}
中包含的整个if块,并可选择查找else
但是允许的{}
其次也只有一个if(flag == 1){
print 1;
}else if(flag == 2){
print 2;
}
- 封闭的条款。正因为如此,一个简单的脚本如:
expected {else-clause}
确实会生成错误消息if(flag == 1){
}else{
if(flag == 2){
}else{
if(flag == 3){
}
}
}
。一种解决方法是将if语句嵌套为:
void
if_command()
{
double exprval;
int end_token;
if (!equals(++c_token, "(")) /* no expression */
int_error(c_token, "expecting (expression)");
exprval = real_expression();
/*
* EAM May 2011
* New if {...} else {...} syntax can span multiple lines.
* Isolate the active clause and execute it recursively.
*/
if (equals(c_token,"{")) {
/* Identify start and end position of the clause substring */
char *clause = NULL;
int if_start, if_end, else_start=0, else_end=0;
int clause_start, clause_end;
c_token = find_clause(&if_start, &if_end);
if (equals(c_token,"else")) {
if (!equals(++c_token,"{"))
int_error(c_token,"expected {else-clause}");
c_token = find_clause(&else_start, &else_end);
}
end_token = c_token;
if (exprval != 0) {
clause_start = if_start;
clause_end = if_end;
if_condition = TRUE;
} else {
clause_start = else_start;
clause_end = else_end;
if_condition = FALSE;
}
if_open_for_else = (else_start) ? FALSE : TRUE;
if (if_condition || else_start != 0) {
clause = new_clause(clause_start, clause_end);
begin_clause();
do_string_and_free(clause);
end_clause();
}
这无疑更加冗长......
code