2008年07月26日

Internet Explorerのホームページについて

Internet Explorerでは「ツール」→「インターネットオプション」→「全般」でソフトを起動したときに表示できるホームページを変更できるが、稀にInternet Explorerの最新バージョンの紹介をするMicrosoftのページに飛ばされることがあるが、そのタイミングに再現性が無く微妙に気持ち悪い。以下に無効にする方法を示す。

「ツール」→「インターネットオプション」→「詳細設定」→「Internet Explorerの更新について自動的に確認する」のチェックを外す


新カテゴリ追加

カテゴリとしと「数学」と「物理学」を追加。
posted by vNull | Comment(0) | TrackBack(0) | 更新情報 | Edit

Javaにおける文字列の扱いとStringBuffer

C++ではSTLにて利用可能なstringクラスがある。従来のC言語では文字列の長さの取得をstrlen()、文字列の比較をstrcmp等で行っていたが、stringクラスを利用することにより、実装されたメソッドやオーバーロードにより文字列操作を行うことが可能である。同様の機能としてJavaにもStringクラスが存在するがC++といくつか異なる点がある。

//C++
cout << "Hello, World" << endl;       //(1)
//Java
System.out.println("Hello, World");   //(2)

(1)のコードはC++で書かれたものである。C++では二重引用符で囲まれたものは処理系依存であるが基本的にconst char*として扱われる。(2)はJavaで書かれたもので、Javaでは二重引用符で囲まれたものはStringオブジェクトとして扱われる。ここが大きな差である。なので以下のようなコードも文法上全く問題無いのである。

System.out.println("Hello, World".length());   //Stringメソッドのlength()を呼び出している

実行結果

12

次に+=演算子等の扱いについて。

//C++
string str("Hello, ");
str += "World";  //(3)

//Java
String str = new String("Hello, ");
str += "World";  //(4)

(3)ではconst char*型である右辺値をstring型オブジェクトである左辺値strでオーバーロードされた+=演算子にてstrのデータを直接書き換えているが、(4)では、String型である右辺値をString型である左辺値の末端に付け加えたオブジェクトを新たに生成し、それを左辺値に代入を行っているのである。これが意図することは、Javaにてforやwhile等でString型のオブジェクトに対して新たな文字列を逐次付け加える処理を行った場合、その都度メモリに新しいオブジェクトが生成されることを意図している。Javaではガーベージコレクタを実装しているので、参照が無効となった時点でメモリが解放されることになっているが、パフォーマンス的に言うならよろしくない。そこでJavaでは文字列の付け加えを行う場合にはStringBufferクラスの使用を推奨している。
もう一つとして、C++では文字列の終端文字として\0を原則としていたが、Javaでは基本的に終端文字は存在しないのである。これは終端文字の役割を考えれば明らかであるが、標準の文字列としてStringオブジェクトを扱うJavaには、そもそも終端文字が必要ないのである。

2008年07月01日

メモリのビット幅の記法

Verilog HDLで64kワードのメモリを宣言する場合には、以下の通りである。

reg [31:0] mem[0:65535]; //(1)
reg [31:0] mem[65535:0]; //(2)

文法的に言えば(1)も(2)も等価であるが、メモリのビット幅の宣言としては(1)が一般的である。その理由としては、テストベンチで$readmemh等を利用して対象のメモリに初期データをシーケンシャル代入する際に、普通はメモリのアドレスが小さい0から65535とファイルの先頭から昇順代入されるが、処理系によっては(1)と(2)と区別され、(2)では65535から0へと降順代入される可能性があるからである。