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 回答
0

您确定要约束二维列表吗?这看起来有点不同。例如对于数组 schedule[4][1]:

schedule: list of list of int;
keep schedule.size() == 4;
keep for each (sublist) in schedule {
   sublist.size() == 1;
   for each (elem) in sublist { 
      ...
   };
};
于 2014-09-02T07:39:14.470 回答