K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2364] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:(ぱ)こと管理人
2024/03/02 02:08:03

> ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 >17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が >表示されません。 このプログラムは、数値を入力するwhileループが11~15行目にあり、 そのwhileループが終わった後、17~19行目に、配列の内容を表示する forループがあります。whileループが終わってからforループが始まるので、 値(数値)を入力するたびに何かが表示されるわけではありません。 このプログラムは、 ①ユーザが数値をいくつか入力する。いくつ入力するかはわからない。 ②ユーザが数値の入力を終えたら、入力された数値を全部表示する。 というものです。①が終わってから②を実行します。 ①でユーザがいくつ数値を入力するかわからないから、realloc()で 配列を伸ばしていく、というのが趣旨です。 ①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 Ctrl+Z を押してからENTERを押してください。 > ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 >本章でfree()を使われていないのはどのような理由からでしょうか。 >入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、 >様々な事が書かれています。 それについては25年くらい前にここに書きました。 https://kmaebashi.com/programmer/c_yota/malloc.html WindowsでもLinuxでも、まともなOSならプログラム終了時にはfree()しなくても 解放してくれるので、たとえばライブラリとして再利用することなど考えられない 書籍のサンプルコードでは、free()は不要だと私は考えています。 当時のfj.comp.lang.cのやりとりも検索したら残っていました。 https://groups.google.com/g/fj.comp.lang.c/c/G4HRnHTdImg?pli=1 まあ、これぐらいもめる話ではあるので、深入りしないほうが無難かと思います……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2363] ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/02/29 23:14:47

 前回、!isalnumの件で伺った者です。 教えて頂き、ありがとうございました。  今回も「ポインタ完全制覇」内の本章の主旨からずれてますが、 自力解決できない箇所があり、申し訳ありませんが二つ質問さてください。  ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が 表示されません。 試しに11行目、while分のブロック内で15行目に printf(" VARIABLE_ARRAY[%d] = %d\n", size-1, variable_array[size-1]);と記述を加えたら、 int型の値を入力する度に上記printf文は表示されます。  List4-4の正しい表示結果は、値(数値)を入力するたびに18行目のprintf文が表示される イメージをしています。 なぜ18行目のprintf文が表示されないのか教えてください。 又、私の理解不足がありましたらご指摘ください。 ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 本章でfree()を使われていないのはどのような理由からでしょうか。 入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、様々な事が書かれています。 教えて頂けたら幸いです。 今回もこのようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2362] Re:unix 用ソースコードのダウンロード
投稿者:ken
2024/02/23 04:19:07

早速のご対応、ありがとうございました。 無事、ダウンロードできました。 >ken様 >ご指摘ありがとうございます。 >>本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)を >>ダウンロードしようとしているのですが、 >>Not found が返されます。 > >経緯はわかりませんが、取り急ぎ復元しました。 >ただ、現在復元した版だと、p.258 Lis4-13 read_line.cの、以下の問題が >直っていないようです。 >https://kmaebashi.com/seiha2/seigo.html#p258 > >申し訳ありませんが修正のうえご利用ください。 >Windows版のsrc_win.zipは直っているのかと思ったら、そちらもそのままでした。 >連休中に対応します。 > >ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2361] Re:unix 用ソースコードのダウンロード
投稿者:(ぱ)こと管理人
2024/02/23 01:30:01

ken様 ご指摘ありがとうございます。 >本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)を >ダウンロードしようとしているのですが、 >Not found が返されます。 経緯はわかりませんが、取り急ぎ復元しました。 ただ、現在復元した版だと、p.258 Lis4-13 read_line.cの、以下の問題が 直っていないようです。 https://kmaebashi.com/seiha2/seigo.html#p258 申し訳ありませんが修正のうえご利用ください。 Windows版のsrc_win.zipは直っているのかと思ったら、そちらもそのままでした。 連休中に対応します。 ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2360] unix 用ソースコードのダウンロード
投稿者:ken
2024/02/22 06:28:33

お世話になります。 本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)をダウンロードしようとしているのですが、 Not found が返されます。 ご確認いただけますでしょうか。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2359] Re:無題
投稿者:(ぱ)こと管理人
2024/02/17 16:17:18

>行末に「^」が入っているのは、私がこれをバッチファイルにしたからで、 >バッチファイルではコマンドの途中で開業を入れる時には「^」を書くからです。 以下のページですね。ご指摘ありがとうございます。修正いたしました。 https://kmaebashi.com/programmer/accesscounter/index.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[2358] 無題
投稿者:rike1019
2024/02/17 02:36:29

行末に「^」が入っているのは、私がこれをバッチファイルにしたからで、バッチファイルではコマンドの途中で開業を入れる時には「^」を書くからです。 誤 開業 正 改行
[この投稿を含むスレッドを表示] [この投稿を削除]
[2357] Re:インターネット上を流れるデータ構造の表現について
投稿者:mhash
2024/01/21 10:44:43

早速のご回答、ありがとうございます。 >>上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で >>書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの >>配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかった >>です。(インターネットではビッグエンディアンなので) > >「インターネットではビッグエンディアンなので」と書いておられるとおり、 >インターネット(TCP/IP)でポート番号やIPアドレスをやりとりする際は、 >ビッグエンディアンで表現するよう定められています。 >これをネットワークバイトオーダーと呼びます。 > >https://atmarkit.itmedia.co.jp/icd/root/72/116970472.html > >>私の仮の理解ですが、以下のようになると思って良いでしょうか? > >なので、これで合っています。 ありがとうございます。安心しました。 >ネットワークバイトオーダーという規定(デファクトですが)をご存じなくて >「どうやってバイトオーダーが違うかもしれないマシン間でデータをやり取り >しているのだろう?」という意図の質問なのかと思いましたが、 >「インターネットではビッグエンディアンなので」とあるのでそれはご存じのようで、 >これで回答になっておりますでしょうか? はい。TCP/IPではバイトオーダーがビッグエンディアンであることは理解していましたが TCPやUDPやらを検索して出てくる図の読み方が分からなかったので、そこの質問でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2356] Re:インターネット上を流れるデータ構造の表現について
投稿者:(ぱ)こと管理人
2024/01/21 09:17:34

>上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で >書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの >配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかった >です。(インターネットではビッグエンディアンなので) 「インターネットではビッグエンディアンなので」と書いておられるとおり、 インターネット(TCP/IP)でポート番号やIPアドレスをやりとりする際は、 ビッグエンディアンで表現するよう定められています。 これをネットワークバイトオーダーと呼びます。 https://atmarkit.itmedia.co.jp/icd/root/72/116970472.html >私の仮の理解ですが、以下のようになると思って良いでしょうか? なので、これで合っています。 ネットワークバイトオーダーという規定(デファクトですが)をご存じなくて 「どうやってバイトオーダーが違うかもしれないマシン間でデータをやり取り しているのだろう?」という意図の質問なのかと思いましたが、 「インターネットではビッグエンディアンなので」とあるのでそれはご存じのようで、 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2355] インターネット上を流れるデータ構造の表現について
投稿者:mhash
2024/01/21 05:14:31

題記の件、TCP/IPモデルに則ったネットワーク(インターネット)上で、特定のデータ構造(IPヘッダやTCPヘッダやUDPヘッダ、あるいは個別のファイルフォーマット等)がどのように各コンピュータの内部で表現されるのかお聞きしたいです。 具体例として、仮にインターネット上の各ホストが全て1バイト=8ビット(1オクテット)のマシンだったとして、たとえばUDPヘッダ(Wikipediaリンク: https://ja.m.wikipedia.org/wiki/User_Datagram_Protocolの「仕組み」-「パケット構造」の章を参照)ってどうメモリ上にマッピングされるのか?ということが分からないです。 上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかったです。(インターネットではビッグエンディアンなので) 私の仮の理解ですが、以下のようになると思って良いでしょうか? 0バイト目:「宛先ポート番号」の上位8ビット分を格納 1バイト目:「宛先ポート番号」の下位8ビット分を格納 2バイト目:「送信元ポート番号」の上位8ビット分を格納 3バイト目:「送信元ポート番号」の上位8ビット分を格納 4バイト目:「チェックサム」の上位8ビットを格納 5バイト目:「チェックサム」の下位8ビットを格納 6バイト目:「データ長」の上位8ビットを格納 7バイト目:「データ長」の下位8ビットを格納 初歩的な質問で恐縮ですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2354] Re:! isalnum(ch);
投稿者:トト
2024/01/09 12:02:14

こんな早くに返信して頂きありがとうございます。 11行目の波括弧を付け加えて頂き”読み飛ばしている感じ”がわかりました。 気持ちが晴れました。 ツッコミもありがとうございます。 周りにプログラミングする人がいなく、そのような会話をすることもない為、 自分だけ分かっていればと頭の中では『インスウ、インスウ・・・』、つい出てしまいました。 ご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2353] Re:! isalnum(ch);
投稿者:(ぱ)こと管理人
2024/01/09 00:59:36

>はじめまして。 はじめまして。質問ありがとうございます。 >List 1-10 get_word.c内の >上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には >入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 英数字以外の記号などが来た場合、isalnum(ch)はfalseですから、 それに!を付けた「!isalnum(ch)」は真になります。 そして、「!isalnum(ch)」が真(かつファイルが終わらない)間、 11~12行目のループがぐるぐる回りますから、英数字以外の文字を読み飛ばすことになって、 17行目では「ここで,chには,単語の最初の文字が格納されている」ことになります。 ええと、11行目のwhile文について、波括弧を省略したのが誤解を招いたでしょうか。 10: /* 空白文字の読み飛ばし */ 11: while ((ch = getc(fp)) != EOF && !isalnum(ch)) { 12: ; 13: } これなら、読み飛ばしている感じがつかめるでしょうか。 ところで、細かいツッコミですみませんが、 >1-4-6「関数の因数として配列を渡す(つもり)」 正しくは「因数」ではなくて「引数」ですが、誤変換さておき、 「引数」の読みは「ひきすう」です。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2352] ! isalnum(ch);
投稿者:トト
2024/01/08 21:24:11

はじめまして。 c言語を学んでいる者です。 入門学習サイト内で『c言語ポインタ完全制覇』を紹介されていたので、併せて学んでいます。 5章「連結リスト版」では苦戦しましたが、新たなポインタの利用法を知ることができました。  只今、理解を深めるため再度、頭から読み進めています。 理解できてない箇所がいくつかあり自力で解決できず投稿しました。 << 質問 >> 1-4-6「関数の因数として配列を渡す(つもり)」 List 1-10 get_word.c内の 11行目 while((ch=getc(fp))!= && !isalnum(ch));で /*空白文字の読み飛ばし*/が出来る仕組みが理解できずに苦戦しています。 大変恐縮ですが解釈の仕方を教えて頂けたら幸いです。 上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には 入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 しかし、buf[len]=ch;には単語の最初の文字が格納され、 結果、プログラムの意図どおり単語のみが表示されます。 このようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2351] Re:Re:Re:のおじさん問題を修正しました
投稿者:774RR
2023/12/11 12:34:23

あーあー、テステス。 元件名が Re:Re:Re なので一見治っていないようですが この発言分が Re:Re:Re:Re になっていないようなので修正済み確認っス。 お疲れ様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2350] Re:Re:Re:のおじさん問題を修正しました
投稿者:(ぱ)こと管理人
2023/12/10 23:02:14

>>件名が Re:Re:Re のおじさんになるのは仕様のようですね。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2349] Re:Re:この掲示板について
投稿者:(ぱ)こと管理人
2023/12/09 02:07:23

>イヤンな spam (?) 投稿が無い分、今のトラフィックで十分幸せになれそうです。 >っていうか spam 投稿フィルタがちゃんと機能しているのでしょうか? 今のところテスト掲示板を含め、spamは消しています。 そんなに数は来ないのですが、何回かは来ています。 spam投稿フィルタは以前と同様NGワードをはじくだけで、spamが来るたびに そこに含まれるURLを登録しているだけなので、あまり聞いてないかと思います。 >件名が Re:Re:Re のおじさんになるのは仕様のようですね。 これはバグ、というか実装漏れですね。昔の私はいろいろちゃんと考えて作っていたようです。 この週末にでも直します……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2348] Re:この掲示板について
投稿者:774RR
2023/12/08 13:23:46

修正済み確認しました。 イヤンな spam (?) 投稿が無い分、今のトラフィックで十分幸せになれそうです。っていうか spam 投稿フィルタがちゃんと機能しているのでしょうか? 件名が Re:Re:Re のおじさんになるのは仕様のようですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2347] Re:Re:この掲示板について
投稿者:(ぱ)こと管理人
2023/12/08 01:29:55

>top page 中 google 検索ボタンのリンクが http:// なので Chrome 120.0.6099.63 で >サイト情報を確認すると「完全には保護されていません」の旨表示されます。 ありがとうございます。Firefoxでも警告が出ました。修正いたしました。 せっかく掲示板を作り直したのに誰も書きこんでくれなくて悲しくなっていたので、 その点でもありがとうございました……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2346] Re:この掲示板について
投稿者:774RR
2023/12/06 12:45:20

今頃気づいた・・・ top page 中 google 検索ボタンのリンクが http:// なので Chrome 120.0.6099.63 でサイト情報を確認すると「完全には保護されていません」の旨表示されます。掲示板のページまで来るとボタンが無いので「この接続は保護されています」になる模様。 証明書の確認は MITM 串が入っている関係で会社からでは不可能でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2345] この掲示板について
投稿者:(ぱ)こと管理人
2023/10/07 21:35:10

移転前の掲示板は2005年頃にPHPで作ったものでしたが、今回、共用のレンタル サーバからVPSに乗り換えたので、言語も自由に選べるので、PHP版は捨てて Java + Spring boot + PostgreSQLで作り直しました。 拡張子は.phpになっていますが、これは以前の掲示板へのリンクを生かすためで、 中身はPHPではありません。 仕様もところどころ変わっています。投稿の手数がちょっと減りました。 cssがキャッシュに残っていると中途半端に効いて表示が崩れるので、 Ctrl + F5とかで強制リロードしてください。 過疎掲示板ですが、今後ともよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2344] Re:掲示板の移行作業を開始します
投稿者:(ぱ)こと管理人
2023/10/07 19:48:31

>この掲示板のデータを移転先サーバに移行します。 >この後に何を書いても、移行対象になりませんのでご注意ください。 移行終了しました(と、新掲示板から書き込む)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2343] 掲示板の移行作業を開始します
投稿者:(ぱ)こと管理人
2023/10/07 19:32:52

この掲示板のデータを移転先サーバに移行します。 この後に何を書いても、移行対象になりませんのでご注意ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2342] 近々サーバを移転します
投稿者:(ぱ)こと管理人
2023/10/05 01:19:03

トップページにも書きましたが、本Webサイトを置いているレンタルサーバの業者が 事業を撤退するとのことで、近々サーバを移転します。 ドメインは変わらないので閲覧者の皆様に特に影響はないと思いますが、 DNSの切り替えがうまくいかなかったり、当方でサーバを再起動したりで 一時的に不安点になる可能性はあります。 あしからずご了承くださいませ。 移転予定日…10/7~10/9の三連休のどこか この掲示板は、過去投稿のデータを含めて新サーバに移行する予定です。 直前に「今から移行する」旨書き込みますので、その書き込みまでの投稿は 新サーバに移ります。 (……のつもりですが、何しろ私のやることなので、とんでもないポカを やらかす可能性もあります) よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2341] Re:関数の戻り値について
投稿者:mhash
2023/08/05 14:51:51

ご返事ありがとうございます。 >できない理由は特にないので、普通にできます。以下、掛け算九九の表をmalloc()で >確保するプログラムです(これは「普通」には見えない、というならまあもっともですが)。 サンプルコードまで示して回答していただきまして大変感激です。ありがとうございます。 私が試したときは『int (*alloc99(void))[9]』の部分を『(int(*)[9]) alloc99(void)』のように書いてしまっていました(キャストの構文と混同していたようです)。確かにお見せいただいたコードなら「配列へのポインタを関数」の宣言になっていますね。 >ただ、 > >>"func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。 > >上記のやってみたいことからすると、そもそもやりたいことは「配列へのポインタ」を >返すことではないようにも思えます。"func()[0].hoge"と書きたいのなら、やりたいことは、 >「構造体へのポインタ」を返すことではないでしょうか。 これはまったくご指摘の通りです。 投稿してから気づいたのですが、訂正前に回答が来てしまってお恥ずかしい限りです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2340] Re:関数の戻り値について
投稿者:(ぱ)こと管理人
2023/08/05 14:19:52

>C言語では、「配列へのポインタ」は関数の戻り値にはできないのでしょうか? >VisualC++でやってみたのですが、無理でした。 できない理由は特にないので、普通にできます。以下、掛け算九九の表をmalloc()で 確保するプログラムです(これは「普通」には見えない、というならまあもっともですが)。 #include <stdio.h> #include <stdlib.h> int (*alloc99(void))[9] { return malloc(sizeof(int) * 81); } int main(void) { int (*array99)[9]; int i, j; array99 = alloc99(); for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { array99[i - 1][j - 1] = i * j; } } for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { printf("\t%d", array99[i - 1][j - 1]); } printf("\n"); } } ただ、 >"func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。 上記のやってみたいことからすると、そもそもやりたいことは「配列へのポインタ」を 返すことではないようにも思えます。"func()[0].hoge"と書きたいのなら、やりたいことは、 「構造体へのポインタ」を返すことではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2339] 関数の戻り値について
投稿者:mhash
2023/08/05 02:15:14

C言語では、「配列へのポインタ」は関数の戻り値にはできないのでしょうか? VisualC++でやってみたのですが、無理でした。 "func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2338] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/08 17:26:51

ご返信いただきまして、ありがとうございます。すっきり理解することができました。 ざっと読んでは細かく読むというのを繰り返している状況です。 また疑問点があった際には質問させていただければと思います。 今後ともよろしくお願いいたします。 >はじめまして。 > >>学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >>読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >>*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >>掛け算はどの段階で行われているのでしょうか。 > >まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に >相当するアドレス計算を行う必要があります。 >*pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような >アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 >というのが該当の記述の趣旨だったのですが、 > >p.75の該当の記述は以下のようになっていて、 >「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの >1回だけで済みます。」 >*pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 >確かに掛け算は不要です。 > >・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 >・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 >ということを言いたかったのですが、「そういう計算」の中身が違いますね。 >本の記述が誤りだと思います。 > >22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 >ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2337] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2023/07/08 16:06:07

はじめまして。 >学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >掛け算はどの段階で行われているのでしょうか。 まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に 相当するアドレス計算を行う必要があります。 *pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 というのが該当の記述の趣旨だったのですが、 p.75の該当の記述は以下のようになっていて、 「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの 1回だけで済みます。」 *pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 確かに掛け算は不要です。 ・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 ・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 ということを言いたかったのですが、「そういう計算」の中身が違いますね。 本の記述が誤りだと思います。 22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2336] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/06 21:57:11

学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 *pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、掛け算はどの段階で行われているのでしょうか。 ご回答よろしくお願いします。 >はじめまして。読んでいただきありがとうございます。 > >>array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >>アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >>に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >>の1回だけ」という意味をご教示いただけるとありがたいです。 > >「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 >各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 >「p + 1要素のサイズ」という計算は100回は行います。 >ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない >コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は >500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 >コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2333] Re:誤植 ポインタ完全制覇 P363
投稿者:TK
2023/05/23 20:27:58

>これですが、規格書(JIS X3010:2003)の「6.7.8 初期化」に以下の記載があります。 ご指摘ありがとうございます。このような書き方が可能なことを知りませんでした…。 勉強になりました。 良く調べてからご連絡すべきでした。失礼しました。 ご対応もありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]