2017-09-30 101 views
1

新的gnuplot(5.x)具有新的邏輯語法,但我無法使'else if'語句正常工作。例如:'else if'gnuplot中的邏輯語句

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

你能避免使用在你的第二個例子'else'並獲得你所需要的。 –

回答

2

基於在最新版本的Gnuplot中對command.c的源代碼的簡要檢查,我會說這個功能不被支持。更具體地說,相關部分可以在1163(見下面)中找到。解析器首先確保if後面跟着括號中的條件。如果以下標記爲{,則它會激活新語法,將封閉在匹配的一對{}中的整個if塊隔離,並且可選地查找else,但是隻允許使用{}(含)條款。由於這個原因,一個簡單的腳本,例如:

if(flag == 1){ 
    print 1; 
}else if(flag == 2){ 
    print 2; 
} 

確實產生錯誤信息expected {else-clause}。一個解決辦法是嵌套if語句爲:

if(flag == 1){ 

}else{ 
    if(flag == 2){ 

    }else{ 
     if(flag == 3){ 

     } 
    } 
} 

這是無可否認稍微詳細...

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(); 
    } 
+0

感謝您關注此事。真的很遺憾,對'else if'的支持已經被拋棄了。我想你的解決方法是在這種情況下可以做到的最好的解決方案。 – Mead