[コンセプト]可変パラメータ関数
可変因子とは?
パラメータ個数不定の関数があります.各関数における引数の個数とデータ型の変化を可変パラメータと呼ぶ.
可変パラメータ関数のデフォルト使用
1.可変パラメータ関数の作成
関数で可変パラメータを定義する場合は、少なくとも1つの固定パラメータが必要です.
パラメータを固定した後...加えて、パラメータの個数が不定であることを示す.
受信した可変パラメータを使用するために、ヘッダファイルで定義されたマクロを使用する必要があります.
ヘッダファイルで定義されたマクロを使用して可変パラメータを使用する.
•va list:可変パラメータリストを宣言するtypedef(可変パラメータのメモリアドレスを格納するポインタ)
•va listap:関数として渡されるパラメータがスタックに格納されます.読み込み時にポインタ演算が行われ、現在読み込んでいる番号を格納するva list型ポインタ変数が必要です.
/va listのタイプはchar*として定義されます.
•va start(ap,param):apはchar*ポインタです.ここでva start関数を実行すると、可変パラメータをインポートするために最初の可変パラメータを指すように初期化されます.
•va arg(ap,type):可変パラメータポインタからtypeサイズで逆参照して値を取得します.実際に可変パラメータを読み込むコマンド.
•va end(ap):可変パラメータポインタnullに初期化
通常、最初のパラメータが可変パラメータを受け入れる個数を指定します.
各種データ入力/アドレス値の特徴
多様な資料型を得ることができるのは、想像以上に頭を悩ませる概念だ.可変因子関数ではvaリストの場合,どのデータ型を入力しても読み込みを超える能力を発揮する.資料型の大きさがそれぞれ違うと思うと、とても効き目があると思います.
これは、可変因子関数が動作するときに対応する空間の大きさを決定し、適切な変形を行うため可能である.
va listから値をインポートする場合はva arg(ap,type)にインポートします.このとき入力したtypeに基づいて寸法を取得します.例えば、アドレス値を取得する場合、voidにインポートできます.(man 3 malloc)void型変数に割り当て、16進数出力に変換すればよい.ただし、ポインタ変数のサイズは、コンパイラ、オペレーティングシステムなどの環境に依存します.しかし、アドレス値はUnnsigned型であり、数進数にかかわらず通常整数型である.したがって,コンパイラで定義したUnnsigned整数型では,最大の値を入力して使用すればよい.もちろんポインタ変数を直接計算することもできますが、危険です.
参考、出典など
https://dojang.io/mod/page/view.php?id=577
https://infinitt.tistory.com/335
https://blog.naver.com/rrhhww0213/221280651085
https://blog.naver.com/harrison1995/222318011406
複数箇所
パラメータ個数不定の関数があります.各関数における引数の個数とデータ型の変化を可変パラメータと呼ぶ.
可変パラメータ関数のデフォルト使用
1.可変パラメータ関数の作成
関数で可変パラメータを定義する場合は、少なくとも1つの固定パラメータが必要です.
パラメータを固定した後...加えて、パラメータの個数が不定であることを示す.
void va_function(int args, ...)
{
printf("args");
}
int main()
{
va_function(1, 2, 7);
va_function(1,2,3,4,5,7,8,9);
return (0);
}
2.可変パラメータの使用受信した可変パラメータを使用するために、
•va list:可変パラメータリストを宣言するtypedef(可変パラメータのメモリアドレスを格納するポインタ)
•va listap:関数として渡されるパラメータがスタックに格納されます.読み込み時にポインタ演算が行われ、現在読み込んでいる番号を格納するva list型ポインタ変数が必要です.
/va listのタイプはchar*として定義されます.
•va start(ap,param):apはchar*ポインタです.ここでva start関数を実行すると、可変パラメータをインポートするために最初の可変パラメータを指すように初期化されます.
•va arg(ap,type):可変パラメータポインタからtypeサイズで逆参照して値を取得します.実際に可変パラメータを読み込むコマンド.
•va end(ap):可変パラメータポインタnullに初期化
通常、最初のパラメータが可変パラメータを受け入れる個数を指定します.
各種データ入力/アドレス値の特徴
多様な資料型を得ることができるのは、想像以上に頭を悩ませる概念だ.可変因子関数ではvaリストの場合,どのデータ型を入力しても読み込みを超える能力を発揮する.資料型の大きさがそれぞれ違うと思うと、とても効き目があると思います.
これは、可変因子関数が動作するときに対応する空間の大きさを決定し、適切な変形を行うため可能である.
va listから値をインポートする場合はva arg(ap,type)にインポートします.このとき入力したtypeに基づいて寸法を取得します.例えば、アドレス値を取得する場合、voidにインポートできます.(man 3 malloc)void型変数に割り当て、16進数出力に変換すればよい.ただし、ポインタ変数のサイズは、コンパイラ、オペレーティングシステムなどの環境に依存します.しかし、アドレス値はUnnsigned型であり、数進数にかかわらず通常整数型である.したがって,コンパイラで定義したUnnsigned整数型では,最大の値を入力して使用すればよい.もちろんポインタ変数を直接計算することもできますが、危険です.
参考、出典など
https://dojang.io/mod/page/view.php?id=577
https://infinitt.tistory.com/335
https://blog.naver.com/rrhhww0213/221280651085
https://blog.naver.com/harrison1995/222318011406
複数箇所
Reference
この問題について([コンセプト]可変パラメータ関数), 我々は、より多くの情報をここで見つけました https://velog.io/@jinwoole/개념-가변인자함수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol