3

一个这样的函数:</p>

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

4

1 回答 1

3

将评论转换为答案。

在标准 C 中,您不能从函数返回数组——您可以返回指针 OK(因此显示的代码是允许的,尽管它显然存在重入和线程问题)。如果不能使用staticormalloc()等​​,则需要将数组传递给函数以供其填充,而不是返回数组。然后分配空间是调用者的责任。

另见srand() — 为什么只调用一次

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

是的,或者是本地数组,或者你想的任何其他类型的数组。我认为适当的实现可能是:

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 在它们的上下文中也是可以的值。)

于 2016-08-09T03:53:33.330 回答