我具有此功能“ cost_compare”,出于某些实验目的,我希望在FPGA上卸载此功能。该函数,如何调用及其参数如下。
综合工具不接受双指针作为硬件函数的参数(实际上,对于使用指针尤其是针对数据结构,它非常挑剔)。
如何摆脱函数自变量列表中的指针?换句话说,如何将本例中的指针转换为值?这种可能的解决方案如何影响spec_qsort通过引用进行的调用?
预先感谢 霍曼
typedef struct arc *arc_p;
typedef LONG cost_t;
typedef struct basket
{
arc_t *a;
cost_t cost;
cost_t abs_cost;
LONG number;
} BASKET;
/* ... */
typedef struct arc
{
int id;
cost_t cost;
node_p tail, head;
short ident;
arc_p nextout, nextin;
flow_t flow;
cost_t org_cost;
} arc;
/* ... */
extern int cost_compare( BASKET **b1, BASKET **b2 );
/* ... */
int cost_compare( BASKET **b1, BASKET **b2 )
{
if( (*b1)->abs_cost < (*b2)->abs_cost )
return 1;
if( (*b1)->abs_cost > (*b2)->abs_cost )
return -1;
if( (*b1)->a->id > (*b2)->a->id )
return 1;
else
return -1;
}
/* ... */
spec_qsort(perm + 1, basket_sizes[thread], sizeof(BASKET*),
(int (*)(const void *, const void *))cost_compare);
/* ... */
BASKET* max, *act;
for (j = 1; j < num_threads; j++) {
act = *perm_p[j];
if (act->number >= 0) {
if (!max || cost_compare(&act, &max) < 0) {
max = act;
max_pos = j;
}
}
/* ... */
BASKET* max_basket;
static BASKET **opt_basket;
for (i = 0; i< num_threads; i++) {
if ((!max_basket && opt_basket[i]) || (opt_basket[i] &&
cost_compare(&opt_basket[i], &max_basket) < 0)) {
max_basket = opt_basket[i];
}
}
/* ... */
答案 0 :(得分:1)
在int cost_compare( BASKET **b1, BASKET **b2 )
中,您不需要双指针,因为您只是在比较元素而不交换任何内容。 (实际上,请注意,您并不是直接使用b1,而是始终取消引用它)
只需将函数签名更改为int cost_compare( BASKET *b1, BASKET *b2 )
。在函数的主体中,将每个(*b1)->abs_const
更改为b1->abs_const
。
此外,由于spec_qsort
需要带有签名int compare (void *, void *)
的函数,因此您可以摆脱这种强制转换“(int(*)(const void *,const void *))cost_compare)”,将其更改将cost_comp的签名签名为适当的签名,然后将参数强制转换到函数内部,如下所示:
int cost_compare( void *a, void *b ){
BASKET *b1 = a;
BASKET *b2 = b;
if(b1->abs_cost < b2->abs_cost){
return 1;
}
...
else return -1;
}
然后调用spec_qsort(perm + 1, basket_sizes[thread], sizeof(BASKET*), cost_compare)
,这样,所有内容都更易于阅读。
答案 1 :(得分:0)
由于cost_compare函数只是比较abs_cost和id,所以为什么不像这样直接传递它们。
int cost_compare(cost_t abs_cost1, int id1, cost_t abs_cost2, int id2)
{
if( abs_cost1 < abs_cost2 )
return 1;
if( abs_cost1 > abs_cost2 )
return -1;
if( id1 > id2 )
return 1;
else
return -1;
}
然后您这样称呼它。
const_compare(act->abs_cost, act->a->id, max->abs_cost, max->a->id)