2014-09-01 47 views
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; 

任何想法?

回答

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};  
    }; 
}; 
0

您确定要限制二维列表吗?这看起来有点不同。例如。用于数组计划[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 { 
     ... 
    }; 
};