0

リスト項目が特定の条件下で特定の値に等しくなるように制限しようとしています。そのために、定義を計算マクロとして考案しました。

define <num_prob_constraints'struct_member> "CHECK_and_SET_CONSTRAINTS <lst'exp>" as computed {

    //var cur : list of uint = <lst'exp>.as_a(list of uint);
    var t : uint =  <lst'exp>.as_a(list of uint).size(); 
    print t;
    for i from 1 to 4 {
        result = append(result,"keep ",<lst'exp>,"[",i,"]==",i,"=> ",<lst'exp>,"[",i,"]==389; \n");
    };
};

私のコードでは、このマクロを次のように使用します。

struct schedule{
    n : uint;
    sched_w : list of list of int;
    CHECK_and_SET_CONSTRAINTS sched_w;
};

しかし、これはうまくいきません。まず、リストの実際のサイズではなく、ランダムなサイズ (マクロから) を出力します。次に、この種のエラーが発生します。

*** Error: '1' is of type 'int', while expecting type 'list of int'.
                      in code generated by macro defined at line 3 in
        sports_sched_macro.e

    keep sched_w[1]==1=> sched_w[1]==389;
             expanded at line 8 in sports_sched.e
CHECK_and_SET_CONSTRAINTS sched_w;

ここで何が間違っているかについてのアイデアはありますか?

4

2 に答える 2

1

マクロは単なるコードの代用です。それらの機能は、解析段階で文字列を (計算されたかどうかに関係なく) 別の文字列に置き換えるだけです。これは、マクロが、生成フェーズに先行する解析フェーズで使用した場所に展開されることを意味します。したがって、実際にはリストはまだ存在せず、そのサイズとアイテムにアクセスできません。より具体的には、マクロは次のように展開されます。

struct schedule {
    n : uint;
    sched_w : list of list of int;
    keep sched_w[1]==2=> sched_w[1]==389;
    keep sched_w[2]==2=> sched_w[2]==389;   
    ...
    ...
};

表示されたエラー メッセージは、特定のリスト アイテムに明示的にアクセスできないことを示しています (リストのサイズとアイテムの値がまだ決定されていないため)。リストのサイズを 4 のままにし、値が 2 の場合は 389 に置き換えたい場合は、既にリストに割り当てられている値にアクセスしようとしているため、post_generate() メソッドを使用する必要がある場合があります。アイテム:

keep sched_w.size()==4;
post_generate() is also{
    for each in sched_w  {
        if (it==2) {it=389};    
    };
}; 
于 2014-09-01T13:50:57.447 に答える