Возможна ли функция возврата массива в 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? Если возможно, как я могу инициализировать массив неизвестного размера, потому что я больше не могу использовать static и malloc?


person Varrian    schedule 09.08.2016    source источник
comment
В стандартном C вы не можете вернуть массив из функции — вы можете вернуть указатель OK (поэтому показанный код допустим, хотя он явно имеет проблемы с повторным входом и потоками). Если вы не можете использовать static или malloc() и др., вам нужно передать массив функции, чтобы он заполнил ее вместо возврата массива. Тогда ответственность за выделение пространства лежит на вызывающем абоненте.   -  person Jonathan Leffler    schedule 09.08.2016
comment
См. также srand() — зачем вызывать его только один раз.   -  person Jonathan Leffler    schedule 09.08.2016
comment
@JonathanLeffler Итак, вы имеете в виду, что я могу установить глобальный массив в качестве аргументов функции и присвоить значение каждому элементу, чтобы я мог получить массив без использования статики и malloc?   -  person Varrian    schedule 09.08.2016
comment
Да, или локальный массив, или массив любого другого типа, о котором вы хотите подумать. Я думаю, что подходящей реализацией может быть: 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…; } или другие варианты.   -  person Jonathan Leffler    schedule 09.08.2016
comment
@JonathanLeffler Спасибо! Ваш ответ решил мою проблему.   -  person Varrian    schedule 09.08.2016


Ответы (1)


Преобразование комментариев в ответ.

В стандартном C вы не можете вернуть массив из функции — вы можете вернуть указатель OK (поэтому показанный код допустим, хотя он явно имеет проблемы с повторным входом и многопоточностью). Если вы не можете использовать static или malloc() и др., вам нужно передать массив функции, чтобы он заполнил ее вместо возврата массива. Затем вызывающая сторона несет ответственность за выделение пространства.

См. также srand() — зачем вызывать его только один раз.

То есть вы имеете в виду, что я могу установить глобальный массив в качестве аргументов функции и присвоить значение каждому элементу, чтобы я мог получить массив без использования static и 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…;
}

or

static int data[20];

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

или другие варианты (например, не использовать static перед определением области файла data — преобразование его в глобальную переменную). (Да, вы, вероятно, использовали бы 10, как в вопросе, или 20 как количество места в массиве, но 15 и 18 также являются допустимыми значениями в их контексте.)

person Jonathan Leffler    schedule 09.08.2016
comment
Ну, не знаю, согласен ли я полностью: в Vivado HLS можно использовать опцию для раздела массива -› полный. Таким образом, вы можете создать аппаратный ускоритель, который будет передавать все данные параллельно (например, другому аппаратному ускорителю). Хочу заметить, что речь идет о FPGA: это язык C, используемый для описания и создания HW. - person Leos313; 20.10.2016