K.Maebashi's BBS

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

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

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

[2205] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/21 19:03:55

回答ありがとうございます。 なんとなく分かった気がします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2204] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/21 18:06:45

すみません、不明点がいまいちよくわかりません。 >37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか >理解できずにいます。 … >例えば、 char slogan[7]; を渡す場合は、 >配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは >一応理解できています。 おなじことです。 char slogan[7]; においてsloganの型は「charの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタ」となります。 char *slogan[7]; においてsloganの型は「charへのポインタの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタのポインタ」となります。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2203] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/20 16:27:08

回答ありがとうございます。 そのページも読んでいたはずなのですが、理解できていなかったようです。 追加で、もう一つ質問があります。 p.241 のList4-5に関してなのですが、 char *slogan[7]; を渡す際に、 37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか理解できずにいます。 p.242 では read_slogan()関数には「charへのポインタの配列」を引数で渡していると 書いてありますが、なぜ slogan のみでcharへのポインタの配列を渡すことになるのかが 分かりません。 例えば、 char slogan[7]; を渡す場合は、 配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは 一応理解できています。 回答お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2202] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/20 00:24:07

こんにちは。 >スタックというのは、データ構造なのか、そういった領域があるのか、 >いまいちわかっていません。 >スタックに積むという表現がp.111あたりにありますが、自動変数の場合は >CPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれる >ということなんでしょうか? スタックという言葉自体は広くはデータ構造を指すので、配列や連結リストで スタックを作ることもありますが、Cにおける自動変数の領域の確保は、 通常はCPUに組み込みで備わっているスタックの機能を使います。 p.114 List 2-6のアセンブリ言語を見ると、%rsp(スタックポインタ)という レジスタが登場しています。これにsp(stack pointer)という名前が付いている ことから、このスタックがCPU組み込みの機能であることがわかるでしょう。 もし、CPUに組み込みのスタック機能がないとしたら、別のレジスタやメモリを スタックポインタに使って同等の機能を実現することはできるでしょうが、 その場合、pushq(List2-6の4行目)やpopq(16行目)のように、1命令でスタックに 値を積んだり取り出したりはできなくなります。スタックは有用な機能なので、 昔から、たいていのCPUには組み込みのスタック機能が付いています。 スタックの領域は、p.100のFig.2-3にあるとおり、仮想アドレスのどこかに OSにより割り当てられています。 >ヒープというのはもともとそういった領域が用意されているのでしょうか? これもp.100のFig.2-3にあるとおり、仮想アドレスのどこかにOSにより 割り当てられています。 >また、 >p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、 >OSにお願いして領域を拡張してもらいます」 >と書いてあります。 >これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? そうです。Fig.2-3の「malloc()により確保された領域」が下に伸びるイメージです。 >また、くだらないことかもしれませんが、 >p.285のList 5-5 >1行目 include <stdio.h>で # が抜けているように思います。 本当ですね。ご指摘ありがとうございます。正誤表に載せます。 (プログラムリストは、ソースから自動処理で編集さんに渡すテキストに 組み込んでいたので、元原稿にはコンパイルが通らないようなソースは ないのですが…… 編集段階で#が抜けてしまったようです。著者としては ゲラのチェックの段階で気付かなければいけなかったのですが…… もうしわけありません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2201] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/16 11:08:26

・スタックに関する質問 スタックというのは、データ構造なのか、そういった領域があるのか、いまいちわかっていません。 スタックに積むという表現がp.111あたりにありますが、自動変数の場合はCPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれるということなんでしょうか? ・ヒープに関する質問 p.135にmalloc()は、...「ヒープからメモリを取ってくる関数」ということになります。 と書いてありますが、 ヒープというのはもともとそういった領域が用意されているのでしょうか? また、 p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、OSにお願いして領域を拡張してもらいます」 と書いてあります。 これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? 初歩的な質問かと思いますが、お答えいただけると嬉しいです。 また、くだらないことかもしれませんが、 p.285のList 5-5 1行目 include <stdio.h>で # が抜けているように思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2200] X-Drawのページの画像について
投稿者:(ぱ)こと管理人
2019/12/05 23:30:02

ポインタ完全制覇新版のX-Drawのページについて、 http://kmaebashi.com/seiha2/xdraw/index.html 画像がすべて表示できない状態になっていました。 画像ファイルがサーバになくて、404状態でした。 原因はわかりませんし、いつからこの状態だったのかもわかりません (もしかして最初から?)。 ひとまず再アップロードしておきました。 ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2199] Re:ポインタ完全制覇 - read_slogan.c
投稿者:(ぱ)こと管理人
2019/11/16 02:04:54

はじめまして。ご指摘ありがとうございます。 >buf[slogan_len - 1] = '\0'; > >したあと、 > >slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); > >していますが、bufの大きさは、slogan_len byteで十分なので、 通常、文字数がlenのとき、'\0'の分を含めてlen+1だけmalloc()するのが 定石ですが、このケースではslogan_lenは改行文字を含んでいて、 その改行文字を'\0'に置き換えるので、malloc()するのはslogan_lenの 分だけでよいですね。 改定前のものからのミスだと思います。正直、まだポカが残っているとは 思いませんでした…… 正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2198] ポインタ完全制覇 - read_slogan.c
投稿者:Tom
2019/11/13 20:20:20

はじめまして、ポインタ完全制覇の四章の`read_slogan.c`での質問です。 buf[slogan_len - 1] = '\0'; したあと、 slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); していますが、bufの大きさは、slogan_len byteで十分なので、mallocのときには、+1する必要はなくて、 slogan[i] = malloc(sizeof(char) * slogan_len); でよいのではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2197] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/17 01:47:29

>Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと >同じであるため、混乱していました。 C++はオブジェクトの実体とポインタの両方を扱えるので obj.hoge(); と obj->hoge(); は別の意味ですが、 Javaはポインタしかないので、Javaにおける obj.hoge(); は、C++における obj->hoge(); と同値です。ポインタしかないJavaではわざわざ1文字多い「->」を使うより、 全部「.」を使う方が打鍵数が少なくてよいとは思いますが、紛らわしいのは 確かですね。 ただ、なんにせよ、オブジェクト指向においては「どのオブジェクトに仕事を 頼むのか」が重要なので、「ポインタ(参照)でオブジェクトを指す」のは 概念的にわかりやすく、C++のように実体を扱える言語より、なんでも参照 (ポインタ)の言語の方がとらえやすいかとは思います。どちらが実用的かとか、 そういう話は置いておくとして。 継承を考えればなおのこと、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2196] Re:オブジェクト指向について
投稿者:C××
2019/10/14 18:40:43

回答ありがとうございます。 Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと同じであるため、混乱していました。 C++からJavaを学ぶ場合(あるいはその逆) 文法が似ているから楽だと書いているサイトをよく見ますが、 かえって紛らわしいなと感じました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2195] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/13 01:47:58

はじめまして。 > ここの記事やほかのサイトを読んでるうちに、結局のところ >「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で >「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」 >という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。 まず、C++を除くたいていのオブジェクト指向言語では、オブジェクトを変数に 格納することはできません。変数に格納できるのはオブジェクトへの参照だけです。 そのうえで、オブジェクトという「小規模なソフトウェア」の組み合わせで それなりの規模のプログラムを作る、というのはそれなりによさげな解釈かと 思います。単に「小規模なソフトウェアの組み合わせで1つのソフトウェアを作る」 だけだと、「モジュール化」と区別がつきませんし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2194] オブジェクト指向について
投稿者:C××
2019/10/10 00:25:10

 初投稿です  オブジェクト指向についてわかったような気になったり、急にわからなくなったりという哲学じみた事を繰り返している内に、最近このサイトに行き着いた者です。  ここの記事やほかのサイトを読んでるうちに、結局のところ 「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で 「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。  犬猫や、レストランの例えよりは一番しっくり来た表現なのですが、厳密には違うような気がします。( operator=() などで定義しないと代入できない辺り)  はっきりとしない質問で恐縮ですが、意見を聞かせてくだされば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2193] Re:Webアプリケーション開発入門のP132について
投稿者:(ぱ)こと管理人
2019/09/10 00:25:20

>② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  > >にクラスパスを通してみようとしましたら、エラーが発生してしまいました。 >大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 エラーを見ると、 >PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません このように、Henacatで作成したサーブレット関連のパッケージやクラスが見えていない ことがわかります。つまり、クラスパスが通っていません。 実行したコマンドラインは以下ですが、 >C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java これを見ると、「C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com」に クラスパスを通していますが、p.132冒頭の記載は、 | この修正を加えたうえで、Henacatのクラスファイルのルートであるcomディレクトリが | 存在するディレクトリ(「com\kmaebashi\henacat\……」というディレクトリ階層の | 根元)にclasspathを向けてコンパイルし、クラスファイルを作ります。 です。「comディレクトリが存在するディレクトリ」ですから、comディレクトリの ひとつ上です。 この場合なら、以下のようにすれば通るかと思います。 > javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_ *.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2192] Webアプリケーション開発入門のP132について
投稿者:javajava
2019/09/08 15:19:21

いつも大変お世話になっております。P132の文章を理解できていない為と思うのですが、私なりに、 ① chap03\testbbs\WEB-INF\classes の3ファイルのP131に該当する部分を修正し、 ② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  にクラスパスを通してみようとしましたら、エラーが発生してしまいました。大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 【以下エラー文】 C:\Users\java\expand_downloads\src\chap03\Henacat_0_1\com\kmaebashi\henacat\webserver>cd C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //javax.servlet.http.*; ^ PostBBS.java:4: エラー: シンボルを見つけられません public class PostBBS extends HttpServlet { ^ シンボル: クラス HttpServlet PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス PostBBS PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス PostBBS ShowBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //import javax.servlet.http.*; ^ ShowBBS.java:4: エラー: シンボルを見つけられません public class ShowBBS extends HttpServlet { ^ シンボル: クラス HttpServlet ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス ShowBBS ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス ShowBBS PostBBS.java:5: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ ShowBBS.java:12: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ エラー10個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>
[この投稿を含むスレッドを表示] [この投稿を削除]
[2191] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:31

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2190] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:26

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2189] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/09/03 01:08:02

>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >下記のようなエラーが出ます。Message.javaはできたようです。 >しかし、PostBBS.javaで躓きます。 すみません、前回の例示は不正確でした。p.97のとおりにやるなら javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java ですね。私の環境ではこれで通りました。 -classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから 抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて エラーになっているわけです。以下のようにカレントディレクトリ「./」を -classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2188] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/31 22:18:55

回答ありがとうございます! メッセージの件、申し訳ありませんでした。以後、注意します。 早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、下記のようなエラーが出ます。Message.javaはできたようです。しかし、PostBBS.javaで躓きます。 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar Message.java C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:13: エラー: パッケージMessageは存在しません Message.messageList.add(0, newMessage); ^ エラー3個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs> このようなエラーが出るのですが、何かお気づきの点等ございますでしょうか? ご教授の程、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2187] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/27 01:01:19

>ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 エラーが出たというのであれば、せめてエラーメッセージは書いてください。 >普通に >javac PostBBS.java としてるのですが・・・。 p.102にPostBBS.javaはないので、どこのソースのことかわかりませんが、 Tomcatで動かすサーブレットをコンパイルするのであれば、 > javac PostBBS.java ではなくて、p.97にあるとおり、 >javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java のように、servlet-api.jarをクラスパスに入れてコンパイルする必要があります。 (Tomcatのバージョンや配置先が違うなら、適宜読み替えてください)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2186] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/25 19:14:00

ご回答ありがとうございます!素晴らしい書籍の執筆ありがとうございます! 時間がとれたので、早速回答に従ってやってみます・・・のような返信を入れたのですが、Upされてないのか、私が不慣れなのか・・・w とにもかくにも、本日もう一度最初からやり直してみましたら、ちゃんと動きました。 ありがとうございました。 ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 普通に >javac PostBBS.java としてるのですが・・・。 ご教授いただければ幸いでございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2185] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/17 16:12:02

>いつもお世話になっております。初めて投稿します。 はじめまして。 >書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」を >ブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめ >んね・・・」と続くページが表示されてしまい、掲示板が表示されません。 書籍の通りの順番でp.99だとすると、「3.3.3.Tomcat で掲示板を作る」のところです。 章タイトルの通り、ここでは、へなちょこサーブレットコンテナHenacatを作る前に、 Tomcatで掲示板を作ろうとしています。 そして、「ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい ごめんなさい…」と続くページは、p.74にあるWebサーバもどき「Modoki/0.2」の 404ページです。 Tomcatの設定をわざわざ変えたのでなければ、TomcatがModoki/0.2の404ページを 返すわけがないので、ここではTomcatではなくModoki/0.2を叩いているのでは ないでしょうか。 ただし、Modoki/0.2のポート番号は8001で、Tomcatのポート番号は8080です。 Modoki/0.2のポート番号をわざわざ変えたのでなければ、 「http://localhost:8080/ShowBBS」 であればTomcatが動くはずです。 考えられる可能性としては、 ①本当は「http://localhost:8001/ShowBBS」を叩いていた。 ②Modoki/0.2のポート番号を8080に変えて実行していて、  Tomcatはポートが塞がっているので起動に失敗している。 のどちらかですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2184] Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/15 12:22:47

いつもお世話になっております。初めて投稿します。 書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」をブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめんね・・・」と続くページが表示されてしまい、掲示板が表示されません。 Tomcatも動いているようですし、書籍の通りやったつもりなのですが、どこが良くないのかがわかりません。同じようなところで躓いて、ピンときた方、いらっしゃいましたら、ご教授お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2183] Re:汎整数拡張について
投稿者:d_kuma
2019/08/12 21:46:36

お世話になっております。 細かい内容について答えていただき、ありがとうございます。 char,shortと、intでの処理速度やサイズの違いについて、よく分かりました。 現在の処理環境なら、あまり気にする必要は無いのかな、という気がしました。 スカラの変数ならintを使うということも理解できました。 お忙しいところ、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2182] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/11 01:20:26

『CプログラミングFAQ』は、持ってたはずなのですが、どこを探しても見当たらない…… >①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、 >int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? この手の性能問題は私は全然詳しくないのですが(アプリケーションプログラマですので…)、 今時のCPUを相手に、どちらが良いとか悪いとかそう一概に言えるものではないと思っています。 たとえば先のchar_test.sとint_test.sをそれぞれGAS(GNU assembler)にかけてみると、 movsblの命令長はmovlよりも確かに長いのですが、int int_var = 5; の「5」が 32ビット幅になるので、結局のところ実効形式のサイズとしてはint_test.sの方が 微増しているようです。 char_test.s 17 0008 C645FF05 movb $5, -1(%rbp) 18 000c 0FBE45FF movsbl -1(%rbp), %eax 19 0010 89C6 movl %eax, %esi int_test.s 17 0008 C745FC05 movl $5, -4(%rbp) 17 000000 18 000f 8B45FC movl -4(%rbp), %eax 19 0012 89C6 movl %eax, %esi 特に配列なら、主記憶は十分にあっても、今時キャッシュに乗らないと性能は出ないので、 小さな型を使った方が早いケースはあるかもしれません。 配列でないなら、どちらにしても、そう大差があるとは思えませんが。 >②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? 配列でないスカラの変数であれば、たとえば1バイト文字しか入らないとわかっていても、 私ならintを使います。「ポインタ完全制覇」にも書きましたが、getchar()の 戻り値やputchar()の引数も、実際intですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2181] Re:汎整数拡張について
投稿者:d_kuma
2019/08/08 17:42:29

ご連絡遅くなりました。 アセンブラの解説をしていただき、ありがとうございます。 char型はアセンブラ上で変換が入るということで理解しました。 会社内で汎整数拡張について聞いてみたら、アセンブラ上で差異は無いと言われたので、間違って理解していました。 movsblというのが分からず、ネットで調べました。 movsはsign extension(符号拡張)によるコピー、blはfrom byte(8ビット) to long(32ビット)ということで理解しました。 これに付随して、さらに質問があります。 ①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? ②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? ①については、char型やshort型を使うと、アセンブラ上で余計な変換が入って実行ファイルが増大してしまう、ということが書かれた技術書を読んだことがあります(『CプログラミングFAQ』だったと思います)。 ②については、C言語ではint型が基準なので、できるだけint型を使うべきなのかなと思っています。 巨大な配列を扱う時にメモリのサイズを減らしたいのでchar型やshort型を使うのはいいと思うのですが、 そうでないなら、できるだけint型を使うべきではと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2180] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/07 01:01:42

こんにちは。 >汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように >扱われる、ということかなと思うのですが、この認識で合っているでしょうか? >Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か >変換処理が行われるわけではないと思っています。 汎整数拡張という機能は、charやshortの変数でも、式の中ではintに変換される、 という機能です。変数に格納された値を使う時にはintでも、変数のサイズは、 charやshortならintより小さいわけですから、メモリから値を取り出して (intと同じビット幅の)レジスタに乗せるときには汎整数拡張による変換処理が 入りますし、逆に(int型の)式の値をcharとかshortの変数に格納するときには、 逆の変換が必要です。 試してみました。 char_test.c #include <stdio.h> int char_test(void) { char char_var = 5; printf("%d", char_var); } int_test.c #include <stdio.h> int int_test(void) { int int_var = 5; printf("%d", int_var); } アセンブラ上の差異は以下です(Linuxでgcc -S)。 char_test.s movb $5, -1(%rbp) ← char_var = 5のところ movsbl -1(%rbp), %eax ← char_varの値をeaxレジスタに移動 int_test.s movl $5, -4(%rbp) ←int_var = 5のところ movl -4(%rbp), %eax ← int_varの値をeaxレジスタに移動 int_test.sでは、単に32ビットを移動するmovl命令が使われていますが、 char_test.sでは、5をchar_varに代入する際にはバイトでの移動命令movbが、 char_varの値を取り出すときにはバイトを32ビットに変換しつつ移動する movsblが使われていることがわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2179] 汎整数拡張について
投稿者:d_kuma
2019/08/05 17:43:35

お世話になっております。 汎整数拡張(又は整数拡張)について質問があります。 汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように扱われる、ということかなと思うのですが、この認識で合っているでしょうか? Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か変換処理が行われるわけではないと思っています。 試しに、char型、short型、int型による演算を、アセンブラ上で比較してみたのですが、差異が出てしまいました。 全て同じような結果になると期待していたのですが、そうはならなかったです。 あまりアセンブラに詳しいわけではないので、自信を持って言えるわけではありませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2177] Re:C言語ポインタ完全制覇
投稿者:(ぱ)こと管理人
2019/05/19 00:56:23

はじめまして。 >180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますが >int型の配列へのポインタなので4×10ではないでしょうか? int *hoge[10]は、そのページの説明にもあるとおり、 「int型へのポインタの配列(要素数10)」です。 ポインタのサイズは処理系依存ですが、その前のページでポインタは8バイトと 仮定しているので、8×10で80バイトです。 なお、「int型の配列へのポインタ」であれば、(指す先は何であれポインタなので) 8バイトになりますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2176] C言語ポインタ完全制覇
投稿者:かずぼん
2019/05/18 08:55:14

最近貴書を購入しました。 一つ質問があります。 180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますがint型の配列へのポインタなので4×10ではないでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2175] Re:Eclipseを使うとclassLoaderで例外が発生
投稿者:Radec
2019/05/12 09:33:25

すみません、自己解決しました。 Eclipseがコンパイル時にデフォルトで使用するバージョンがJavaSE11になっていたので、CokkieTestもreleaseオプションで指定で同バージョンにすることで解決致しました。 (というかそもそもスタックトレース見ろレベルの質問でした、大変失礼致しました。)
[この投稿を含むスレッドを表示] [この投稿を削除]