使用值代替指针作为函数参数

时间:2019-05-31 01:33:13

标签: c

我具有此功能“ 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];
        }
    }
/* ... */

2 个答案:

答案 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)