函数是否可以在Vivado HLS中返回一个数组?

时间:2016-08-09 02:27:09

标签: c arrays vivado vivado-hls

这样的功能:

int * getRandom( ) {

   static int  r[10];
   int i;

   /* set the seed */
   srand( (unsigned)time( NULL ) );

   for ( i = 0; i < 10; ++i) {
      r[i] = rand();
      printf( "r[%d] = %d\n", i, r[i]);
   }

   return r;
}

这个可以在Vivado HLS中使用吗?如果可能,我如何初始化未知大小的数组,因为我不能再使用staticmalloc了?

1 个答案:

答案 0 :(得分:3)

将评论转换为答案。

在标准C中,您不能从函数返回一个数组 - 您可以返回一个指针OK(因此显示的代码是允许的,尽管它显然具有重新入侵和线程问题)。如果您不能使用staticmalloc()等,那么您需要将数组传递给函数,以便填充而不是返回数组。然后是调用者负责分配空间。

另见srand() — why call it only once

  

所以你的意思是我可以将全局数组设置为函数参数并为每个元素赋值,这样我就可以在不使用staticmalloc的情况下获取数组?

是,或者您想要考虑的本地数组或任何其他类型的数组。我认为适当的实施可能是:

void getRandom(int n_vals, int *i_vals)
{
    for (int i = 0; i < n_vals; i++)
        i_vals[i] = rand();
}

但可能的变化是军团。如果你真的需要,你可以恢复打印;如果你真的想要,你甚至可以打电话给srand()(但你应该只打电话一次)。然后你就可以使用它:

void somefunc(void)
{
    int data[20];
    getRandom(15, data);
    …use data…;
}

static int data[20];

void somefunc(void)
{
    getRandom(18, data);
    …use data…;
}

或其他变体(例如在static的文件范围定义之前不使用data - 将其转换为全局变量)。 (是的,你可能在问题中使用10,或者20作为数组中的空间量 - 但15和18在它们的上下文中也是OK值。)