呼び出された関数がその仕事をできるように多くの支援を提供しないと、それを行うことはできません。標準 C ライブラリの 2 つの「多態性」関数を見てqsort()
くださいbsearch()
。
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
void *bsearch(const void *key, const void *base, size_t nel,
size_t width, int (*compar)(const void *, const void *));
およびファミリは、複数の型を処理するその他の関数ですprintf()
。scanf()
印刷配列関数には、次のものが必要になる可能性があります。
typedef int (*DataPrinter)(void *ctxt, void *data);
extern int prarray(void *base, size_t nel, size_t width,
DataPrinter pr_func, void *ctxt)
データ プリンター関数ポインターは、data
パラメーターで指定された 1 つの値を出力する役割を果たします。このctxt
値は、データ プリンター機能が必要とする制御情報へのポインターです ( のように単純なFILE *
場合もあれば、より複雑な場合もあります)。データ プリンター関数から返される値は、書き込まれた文字数です。から返される値prarray()
は、書き込まれた文字の総数です。
もちろん、これは 1 次元配列に対してのみ機能します。2D または 3D 配列のサブセクションを印刷するには、より複雑なコードが必要です。改行などを気にする必要がある場合は、ctxt
. または、この関数へのより複雑なインターフェイスを考案します。値セパレータを指定するために提供される唯一のメカニズムは、ctxt
構造体を介するものであることに注意してください。これは動作します (または動作させることができます) が、あまりにもぎこちないかもしれません。
C2011 のソリューション_Generic
は興味深いものですが、N 個の型に対して N 個の関数が必要で、それぞれが配列の出力を処理します。完全にくねくねすることはできません。私のソリューションには N+1 個の関数が必要ですが、そのうちの 1 つ (1 つ) だけが配列を処理します。N 個の関数はそれぞれ、指定された型の単一の値の出力を処理します。これは、指定された型の配列全体を出力するよりも簡単なプロセスです。もちろん、前述のように、関連するすべてのプラットフォームで C 2011 コンパイラが必要です。「頻繁に関連する」プラットフォームの少なくとも 1 つには、そのサプライヤーから C 1999 コンパイラが提供されていないため、そのプラットフォームで C 2011 を使用できるようになるまでにはしばらく時間がかかる可能性があります。