2024/01/15
Q.未研磨・未改装の本を入手したい
A.
未研磨・未改装の本の入手方法については、申し訳ありません、私共には心当たりがありません(研磨・改装について、あまり意識したことがありませんでした)。
※お問い合わせへの回答メールが戻ってきてしまうので、こちらで回答させていただきました。
2024/02/03
Q.「n<(w-4)/2*(h-3)/2」と「m[(w-4)+(h-3)*w]='G'」の意味(Chapter19, p.662)
A.
dig.cに記述された、以下の式について補足します。
(1) n<(w-4)/2*(h-3)/2
(2) m[(w-4)+(h-3)*w]='G'
wは迷路の幅、hは迷路の高さです。p.658のように、迷路の周囲には文字+、各行の末尾には改行文字∖n、配列の末尾にはヌル文字∖0を配置してあります。例えば次のような迷路では、wは6、hは5です。説明のために、非常に小さな迷路の例にしました。以下で□は格子点を表します。
+++++∖n
+###+∖n
+#□#+∖n
+###+∖n
+++++∖n∖0
式(1)(2)に含まれる(w-4)は、wから「+を2個、#を1個、∖nを1個、で合計4個」を取り除いた文字数を計算しています。上記の例では、(w-4)は2です。これを2で割って「(w-4)/2」を計算すると1となり、幅方向の格子点の個数(上記の例では1個)が求まります。
式(1)(2)に含まれる(h-3)は、hから「+を2個、#を1個、で合計3個」を取り除いた文字数を計算しています。上記の例では、(h-3)は2です。これを2で割って「(h-3)/2」を計算すると1となり、高さ方向の格子点の個数(上記の例では1個)が求まります。
幅方向の格子点の個数と、高さ方向の格子点の個数を乗算すれば、全ての格子点の個数が求まります。したがって式(1)の「(w-4)/2*(h-3)/2」は、全格子点の個数を表します。式(1)の「n<(w-4)/2*(h-3)/2」は、処理済みの格子点の個数(n)が、全格子点の数に満たない限り、処理を続けるための条件式です。
式(2)の「(w-4)+(h-3)*w」は、右下端の格子点(ゴールの位置)に相当する、配列の添字を計算しています。右下端の格子点は、左から(w-4)桁目、上から(h-3)行目の位置にあります(いずれも0から数えます)。配列には1行あたりw個の文字があるので、「(h-3)*w」で(h-3)行目の左端の添字が計算できます。これに(w-4)を加算して「(w-4)+(h-3)*w」とすれば、右下端の格子点(ゴールの位置)の添字になります。
以下はwが8、hが7の例です。上記の方法で式(1)(2)を計算し、格子点の個数やゴールの位置が正しく求まることを確認してみてください。
+++++++∖n
+#####+∖n
+#□#□#+∖n
+#####+∖n
+#□#□#+∖n
+#####+∖n
+++++++∖n∖0
2024/04/09
Q.「path」か「*path」か(Chapter17, p.600)
A.
ext.cの「printf("%s/%s\n", path, entry->d_name)」における「path」は、「*path」ではなく、掲載されている「path」が正しいです。このプログラムの「path」と「*path」は、次のような意味です。
- path
文字列の先頭アドレス。char*型。
例えば「./ext」という文字列ならば、先頭の文字「.」を指すアドレス。
- *path
文字列の先頭の文字。char型。
例えば「./ext」という文字列ならば、先頭の文字「.」の文字コード。
printf関数において、変換指定の%sに対する引数は文字列(文字を指すアドレス)です。そのため*path(文字コード)ではなく、path(文字を指すアドレス)を渡しています。
上記を理解するには、文字列・配列・アドレス・ポインタといった知識を連携させる必要があるので、少し難易度が高いです。本書における関連項目を以下に挙げますので、ご参照いただけましたら幸いです。
- 変換指定の%sに対する引数は文字列(p.109)。
- 配列名は配列の先頭アドレスを表す(p.294)。
- 文字列は文字の配列(p.321)。
- ポインタには配列の先頭アドレスを代入できる(p.472)。
- 関数はポインタの引数で配列を受け取れる(p.479)。
- 文字列(文字配列)もポインタを使って関数に渡せる(p.481)。
- コマンドライン引数のargvは文字列を指すポインタの配列(p.493)。