2017-05-30 14 views
0

私はNE10 libraryを使っていくつかのベクトル計算を行っています。 Iは、引数とを行うように、これらの構造体の配列をとる関数、(複素数の1Dアレイ)を有するたい構造体の配列を渡す

typedef struct 
{ 
    ne10_float32_t r; 
    ne10_float32_t i; 
} ne10_fft_cpx_float32_t; 

:ライブラリは、このような構造体である複素数の型を有します配列のrまたはi要素のみのベクトル計算。ここではアイデアを得るために、このような機能の例です。

void multiple_real_part_by_two(ne10_fft_cpx_float32_t* output, 
    ne10_fft_cpx_float32_t* input, ne10_uint32_t array_length) 
{ 
    ne10_mulc_float_c (&output->r, &input->r, 2.0, array_length) 
} 

だから私は、出力配列は、入力配列のようになりたいのですが、Rの要素のそれぞれが2倍されなければなりません。問題は、関数が上に書かれた方法が機能せず、セグメンテーションフォールトにつながることです。私は問題がどのようにne10_mulc_float_c()関数にr要素の配列を渡そうとしていると思います。

ne10_mulc_float_c()関数は、array_lengthのタイプne10_float32_tの2つの配列へのポインタを引数としてとります。入力配列の要素に3番目の引数として渡された数が乗算され、結果が出力配列に格納されます。ドキュメントは見つかりましたhere.

これを行う方法はありますか?私はちょうどループの

for (int i = 0; i < array_length; i++) { 
    output[i].r = input[i].r * 2.0 
} 

でこれを行うことができます知っているが、パフォーマンスが重要であるので、私は私が最初の場所でNE10が提供するベクトル演算を使用しようとしています理由である、これを行うにはしたくありません。

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+1

cまたはC++を1つお選びください。これらは異なるプログラミング言語です。 –

+0

問題は、 '&output-> r'は' ne10_float_t'値の配列の先頭ではないということです。それは構造体の配列内の要素へのポインタです。このため、このジョブで 'ne10_mulc_float_c()'関数を便利に使うことはできません。 –

答えて

0

問題は、正しいタイプの引数をne10_mulc_float_c()与えることですが、前提条件と一致しません。

library's documentation pageによれば、関数は次のように定義されている次の引数で

ne10_result_t ne10_mulc_float_c (ne10_float32_t *dst, ne10_float32_t *src, 
            const ne10_float32_t cst, ne10_uint32_t count) 

[out] dst Pointer to the destination array 
[in] src Pointer to the source array 
[in] cst The constant to multiply by 
[in] count The number of scalar values to be processed 

この関数はDST及びsrcがの配列へのポインタされていることを前提としていることを意味count連続した浮動小数点数。

残念ながら、あなたが渡す引数には当てはまりません: &output->r&input->rは両方とも、単一のフロートへのポインタです。この関数が期待する配列の2番目の項目にアクセスしようとするとすぐに、コードは配列の本当の範囲を超えています。これはUBです。これが機能しないため、セグメンテーション違反が発生します。

あなたのfor-loopは問題ありません。忘れないでください:

Premature optimization is the root of all evil
-Donald Knuth

+0

ありがとうございます!これは私が自分自身を考え出したものですが、あなたの説明はそれをより明確にしました。 それはタイプ 'のtypedef構造体 {ne10_float32_t xの配列への引数ポインタとしてかかるので、私は、私の目的のために機能' ne10_mulc_vec2f_cを() 'を使用することができるかどうかのだろうか。 ne10_float32_t y; } ne10_vec2f_t; ' 構造体の型が同じであるため、この関数に' ne10_fft_cpx_float32_t'の配列へのポインタを渡すことができますか?ドキュメントは同じ[ページと同じ](http://projectne10.github.io/Ne10/doc/group__MUL__VEC.html) – hulappa

+0

ヘッダーファイルでは、ne10_vec2f_tとne10_fft_cpx_float32_tはまったく同じ構造を持っていますメンバー名の例外を除いて)あなたは両方のために同じtrivially copyableレイアウトを持っているので、これを試すことができます。 Cでは、これがうまくいく大きなチャンスがあります。 C++では、関数がstd :: copy()アルゴリズムを使って実装されていると失敗する可能性があります。どちらの場合でも、これは動作することは保証されません。たとえば、両方の構造が異なる隠れたメンバーとは異なる進化をする場合、 – Christophe