2016-08-09 15 views
2

機能:関数は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で使用することができ、この1か?可能であれば、staticmallocをもう使用できないため、未知のサイズの配列をどのように初期化できますか?

+0

標準Cでは、配列から関数を呼び出す - あなたはポインタをOKに戻すことができます(コードは再入可能とスレッド発行を持っていますが、表示されているコードは許可されています)。 'static'や' malloc() 'などを使うことができない場合は、配列を返すのではなく、配列を関数に渡して記入する必要があります。次に、スペースを割り当てるのは発信者の責任です。 –

+0

['srand()'も参照してください - なぜそれを一度呼び出すのですか?](http://stackoverflow.com/questions/7343833/srand-why-call-it-only-once/) –

+0

@JonathanLefflerだから、関数の引数としてグローバル配列を設定し、静的およびmallocを使用せずに配列を取得できるように各要素に値を与えることができますか? – Varrian

答えて

3

コメントを回答に変換します。

あなたは、標準Cには、関数から配列を返すことはできません - あなたは、ポインタのOKを返すことができます(そう示されたコードは、それがはっきりしているものの、再入可能およびスレッドの問題、許されます)。 staticまたはmalloc()などを使用できない場合は、配列を返す代わりに、配列を関数に渡して入力する必要があります。次に、スペースを割り当てるのは発信者の責任です。

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…; 
} 

または他の変異体(例えばdataのファイル・スコープ定義の前にstaticを使用していないとして - グローバル変数に変換します)。 (質問では10を、配列のスペースとしては20を使用しますが、15と18も状況に応じてOKです)

+0

まあ、私は完全に同意するか分からない:** Vivado HLS **では、 "partition - > complete"という配列のオプションを使うことができる。このようにして、すべてのデータを並列に(たとえば別のhwアクセラレータに)渡すハードウェアアクセラレータを作成できます。私はFPGAについて話していると言いたいと思います。これは、HWを記述し作成するために使用されるC言語です – Leos313

関連する問題