2017-09-30 41 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

...:などのステートメント場合は、1つの回避策は、巣になります。 –

答えて

2

最新バージョンのGnuplotでソースコードcommand.cを簡単に調べたところ、この機能はサポートされていないと言えます。具体的には、該当部分は1163(下記参照)に記載されています。パーサーはまず、ifの後にカッコで囲まれた条件が続くことを確認します。次のトークンが{である場合、新しい構文をアクティブにし、一致するブロックの1つに囲まれたブロック全体を分離し、場合によってはelseを検索します。ただし、{} -enclosed句のみが続くことが許可されています。このため、簡単なスクリプトなど:

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){ 

     } 
    } 
} 

あなたはあなたの第二の例では、 `else`を使用しないよう、あなたが必要なものを得ることができます

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

関連する問題