K.Maebashi's BBS

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

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

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

[2210] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/05 12:09:19

回答ありがとうございます。 すぐに読ませていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2209] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2020/01/03 21:13:33

>もう一つ質問があります。 >ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを >解釈しているのかが理解できれば、より理解が深まるなと考えています。 >そこで処理系に関するおすすめの書籍などがあれば教えていただけると非常に嬉しいです。 処理系に関する本、というと私が答えるなら当然これになるわけですが プログラミング言語を作る https://amzn.to/2szojNN 10年前の本なので新刊入手は難しいでしょうし、「機械語を生成するCコンパイラ」を 作っているわけではないのでHello Worldさんの目的にはちょっと合わないかもしれません。 Web版なら無料なのでよろしければどうぞ。crowbarはともかくDiksamの方は、 バイトコードコンパイル型の言語なのでCにも通じるところはあるかと思います。 http://kmaebashi.com/programmer/devlang/index.html 機械語を生成するCコンパイラの本であれば、私が大昔に読んだのはこれですが、 yaccによるCコンパイラプログラミング https://amzn.to/2SP8bT1 こちらも入手困難かもしれません(昔はマーケットプレイスでとんでもない高値が ついていました……)。 今なら、Rui Ueyamaさんの、こちらのページとかどうでしょうか(完結していませんが)。 https://www.sigbus.info/compilerbook
[この投稿を含むスレッドを表示] [この投稿を削除]
[2208] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/02 15:39:55

回答ありがとうございます。と共に返信遅くなり、申し訳ありません。 >はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 >2-6-6(p.147)にも書いたとおりです。 2-6-6 読み直しました。4章(List 4-4 realloc.c)で色々試したことにより深く理解することができました。 ありがとうございます。 >どこに疑問を持たれているのかいまひとつわかりませんが、 >確かにrealloc()は異なるアドレスを返すことがあります。 >たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで >アドレスBを返したとして、Bを返すとき、realloc()は >A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 >よって、このサンプルでは、17行目からのforループで値を表示することは >問題なくできます。 > >これで回答になっていますでしょうか? はい、的確な回答ありがとうございます。 17行目の部分も理解することができました。ありがとうございます。 >実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を >表示してみると挙動がわかるかもしれません。 >具体的には13行目と14行目の間に以下の2行を挿入します。 > >printf("variable_array..%p\n", variable_array); >malloc(10); > >明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の >続きを埋めることでrealloc()が別の領域を返すことを促すためのものです >(コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では >最適化オプションを付けなければ大丈夫でした)。これを付けないと、 >何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう >(p.147参照)。 > >上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを >返してきました。 アドレスを表示することは何度もやっていましたが、mallocにより別の領域を返すことを促す発想はありませんでした。 ちなみにわたしの環境では、realloc()は6回目で異なるアドレスを返してきました。 もう一つ質問があります。 ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを解釈しているのかが理解できれば、より理解が深まるなと考えています。そこで処理系に関する おすすめの書籍などがあれば教えていただけると非常に嬉しいです。 回答ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2207] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/29 14:42:22

はじめまして。 >realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で >>「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる >>組み込み型に対応できるようにアラインメントされており、ptrとは異なることも >ある。」と説明されています。 はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 2-6-6(p.147)にも書いたとおりです。 >List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によって >ヒープ領域にストアした値をprintf関数により、variable_array[i]という形で >参照しています。これは実際には *(variable_array + i) という形に >読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で >記述されている「ptrとは異なることもある」が実際に起こった場合、 >List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが >一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする >*(variable_array + i)は上手く目的の値をとってくることが、 >できないのではないでしょうか。 どこに疑問を持たれているのかいまひとつわかりませんが、 確かにrealloc()は異なるアドレスを返すことがあります。 たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで アドレスBを返したとして、Bを返すとき、realloc()は A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 よって、このサンプルでは、17行目からのforループで値を表示することは 問題なくできます。 これで回答になっていますでしょうか? >今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 >自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 >本を書いてくださりありがとうございました。 ありがとうございます。 実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を 表示してみると挙動がわかるかもしれません。 具体的には13行目と14行目の間に以下の2行を挿入します。 printf("variable_array..%p\n", variable_array); malloc(10); 明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の 続きを埋めることでrealloc()が別の領域を返すことを促すためのものです (コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では 最適化オプションを付けなければ大丈夫でした)。これを付けないと、 何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう (p.147参照)。 上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを 返してきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2206] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2019/12/27 19:06:55

・realloc関数についての質問(p238 List 4-4 realloc.c)  realloc関数の呼び出しは13行目 variable_array = realloc(variable_array, sizeof(int) * size); realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で 「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる組み込み型に対応できるようにアラインメントされており、ptrとは異なることもある。」と説明されています。 man command のrealloc関数の書式は以下の通り。 void *realloc(void *ptr, size_t size); List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によってヒープ領域にストアした値をprintf関数により、variable_array[i]という形で参照しています。これは実際には *(variable_array + i) という形に読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で記述されている「ptrとは異なることもある」が実際に起こった場合、List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする *(variable_array + i)は上手く目的の値をとってくることが、できないのではないでしょうか。 拙い文ではありますが、何卒よろしくお願いします。 今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 本を書いてくださりありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[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型を使うべきではと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]