1

Cの配列で一般的なマップ操作を定義するにはどうすればよいですか?

理想的には、Pythonのmap(function、array)~~のようなものが必要ですが、マクロとして使用します。これはC++のstd::transformのようなものになると思いますが、Cであり、イテレータを使用しません。

(これは単項演算になります)私は次のようなことを考えていました:

template <class T*, class U*,size_t N>
T* map(T (*func)(U), U* arr,size_t N)
{
   T* tmp = (T*)malloc(sizeof(T) * N);
   size_t i;
   for(i=0;i<N;i++)
   {
       *(tmp+i) = *func(*(arr+i));
   }
}

...しかし、もちろんテンプレートはC ++であるため、1)後者を実行し、2)可能であれば、上記のコードスニペットを修正するにはどうすればよいですか。

ありがとう

4

2 に答える 2

1

このようなテンプレートの場合、マクロへのかなり簡単な変換があります。構文上の主な問題は、結果の配列を返すことができないことです。これを書き込む変数は、別のパラメーターである必要があります。

#define map(func_, input_, output_, type_, n_) do { \
    output_ = xmalloc(sizeof(type_) * (n_));        \
    size_t i_;                                      \
    for (i_ = 0; i_ < (n_); i_++)                   \
        output_[i_] = func_(input_[i_]);            \
  } while (0)

コンパイラの警告に注意を払えば、これは見た目ほどタイプセーフではありません。ただし、このマクロの使用に対する実際の引数のいずれかが単純な識別子でない場合は、特に安全ではありません。最も重要なことは、実際の議論のいずれかに副作用がある場合、壊滅的な事態が発生することです。

結果の配列を返すことができないのと同様に、これは解決できますが、GNU拡張機能を使用する意思がある場合に限ります...

#define gnumap(func_, input_, type_, n_) ({                    \
    __typeof(func_)   func__   = (func_);                      \
    __typeof(input_)  input__  = (input_),                     \
                      output__ = xmalloc(sizeof(type_) * n__); \
    __typeof(n_)      n__      = (n_),                         \
                      i__;                                     \
    for (i__ = 0; i__ < n__; i__++)                            \
        output__[i__] = func__(input__[i__]);                  \
    /* return */ output__;                                     \
  })

実生活でこれらのいずれかを実行しますか?おそらくそうではありませんが、実際に利用可能な最も悪いオプションである場合もあります。これは、アセンブリ言語でその重要な内部ループを書き直すことを恥ずかしがる一歩と考えてください。

xmallocこれに慣れていない場合は、mallocプログラム全体を成功またはクラッシュさせるユーザー作成ラッパーの従来の名前です。ここでは、malloc失敗に対処する方法の問題を回避するために使用します。)

于 2013-02-08T23:41:12.953 に答える
0

したがって、関数ポインタとデータへのvoid *(またはchar *)、およびデータサイズを受け取る関数を記述できます。

私は確かにこれを行うためにマクロだけを使用するわけではありませんが、次のようなことを行うマクロがあるかもしれません。

 #define MAP(func, type, arr, size) map(func, sizeof(type), arr, size)

そしてmap、私が上で説明した機能です。

于 2013-02-08T23:32:28.700 に答える