MSVCRT std::for each 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(概要)
(概要)
 
22行: 22行:
  
  
 LPWSTR* argvUTF16がw_char型の先頭アドレスを保持していて、例えばargcUTF16(4Byte文字)の要素数の2を足すと(4Byte*2個)8byte(32bit)分アドレスが進んだところまで繰り返す感じです。例えば、argvUTF16に要素が1つだけならば、要素2はNULLになる感じで組み込まれるでしょう。
+
 LPWSTR* argvUTF16がw_char型の先頭アドレスを保持していて、例えばargcUTF16要素数の2を足すとargvUTF16のアドレス格納bit数(32bit(=4byte) or 64bit(=8Byte)) に対して要素数2個分進んだところまで繰り返す感じです。例えば、argvUTF16に要素が1つだけならば、要素2はNULLになる感じで組み込まれるているので、for_eachの繰り返しは要素番号1の文字列、そして要素番号2のNULLの2つについて処理が行われ、NULLを受け取ったfor_eachはそこで処理を終えます。
  
  
 ということなので、for_eachで関数を繰り返し実行するようにプログラムはされていますが、要素数が2で、文字列が格納されている要素数が1であれば、単純にQByteArrayテンプレート化されているvector型argvUTF8Qの最後尾に付け足す処理が実行されます。このとき、argvUTF8Qあとで、使いたいのでfor_each内だけのオブジェクトでは活用できません。外からの引数としてラムダ式の [] 内に記述してある必要があります。そして、argにはLPWSTR* argvUTF16のアドレスが渡されconst char* argはキャストされてQString::fromUtf16静的メンバ関数を利用して、UTF-16にエンコードされます。さらにfromUtf16(xxx).toUtf8という記述であるため、UTF-16になった文字列が、UTF-8に変換された値がemplace_backの引数となるため、結局はargvUTF16から取り出された引数のargがUTF-8になってargvUTF8QというQByteArray型にテンプレート化されたvector型の値として、UTF-8形式の文字列を最後尾に持つようになります。
+
 ということなので、for_eachで関数を繰り返し実行するようにプログラムはされていますが、要素数が2で、文字列が格納されている要素が実質1であれば、単純にQByteArrayテンプレート化されているvector型argvUTF8Qの最後尾に文字列を付け足す処理が実行されます。このとき、argvUTF8Qをあとで、使いたいのでfor_each内だけのオブジェクトでは活用できません。外からの引数としてラムダ式の [] 内に記述してある必要があります。[]はキャプチャと呼ばれます。そして、argにはLPWSTR* argvUTF16のアドレスが渡されconst char* argはキャストされてQString::fromUtf16静的メンバ関数を利用して、UTF-16にエンコードされます。さらにfromUtf16(xxx).toUtf8という記述であるため、UTF-16になった文字列が、UTF-8に変換された値がemplace_backの引数となるため、結局はargvUTF16から取り出された引数のargがUTF-8になってargvUTF8QというQByteArray型にテンプレート化されたvector型の値として、UTF-8形式の文字列を最後尾に持つようになります。
  
  
 ややこしかったかな?
+
 サンプルプログラムのくせに、Qtというライブラリを使ったサンプルで、ややこしかったかな?Qtで提供されている型以外の型でも動きます。Qtっていうライブラリが便利だよっていうことと、いろいろな型で動かせるよということを言いたかっただけです。
  
  
 for_eachの動作が分かってもらえたかなと思っています。さらには文字列配列ポインタに整数を1byte分の整数値を足せば次の要素にいけるということです。charは4byteなので2個足すと8byte先に移動します。これは32bitなので、配列で言うと1つ分です。そういうアドレスの型への整数の足し算の仕組みを理解していれば、理解はできると思います。[[Cpp ラムダ式]]はリンク先でも簡単に説明しています。サンプルプログラムを書くとか言っておきながらさぼってますけど。
+
 for_eachの動作が分かってもらえたかなと思っています。さらには文字列配列ポインタに整数を足すように記述をすると繰り返し処理したい要素数を指定したのと同じことになり、繰り返したい要素が指定できるということも理解できたと思います。現在、使われているプログラムが32bitアプリか64bitかに合わせてなので、配列要素数2個分まで繰り返すというものになっています。。このようなアドレスの型への整数の足し算の仕組みを理解していれば、理解はできると思います。[[Cpp ラムダ式]]はリンク先でも簡単に説明しています。サンプルプログラムを書くとか言っておきながらさぼってますけど。
  
 
 
 
 
  
 
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る
 
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る

2021年2月12日 (金) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス