2008-08

変数宣言の位置によってエラーになったりならなかったりする。(Visual C++ 6.0, C2275, C2146)

 ここ2〜3日の間、古いC言語のプログラム(1992年作!)を修正しているのですが、ちょっとおもしろいことがあったのでメモメモ。

 たとえばtest.cというファイル名で次のようなコードを書いたとする。

#include <stdio.h>

typedef void *HANDLE;

int main(void)
{
 printf("This is C++ like syntax with .c suffix.\n");
 int i;
 HANDLE h;

 return 0;
}


 これをCygwinのgccでビルドするとこうなる。

d:\Home>gcc test.c
gcc test.c

d:\Home>


 エラーは出ない。
 Visual C++ 6.0でビルドするとこうなる。

--------------------構成: test - Win32 Debug--------------------
コンパイル中...
test.c
D:\Home\test.c(8) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
D:\Home\test.c(9) : error C2275: 'HANDLE' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
D:\Home\test.c(3) : 'HANDLE' の宣言を確認してください。
D:\Home\test.c(9) : error C2146: 構文エラー : ';' が、識別子 'h' の前に必要です。
D:\Home\test.c(9) : error C2065: 'h' : 定義されていない識別子です。
cl.exe の実行エラー

test.exe - エラー 4、警告 0


 こうだと通る。

#include <stdio.h>

typedef void *HANDLE;

int main(void)
{
 int i;
 HANDLE h;
 printf("This is C++ like syntax with .c suffix.\n");

 return 0;
}


 ビルドすると…、

--------------------構成: test - Win32 Debug--------------------
コンパイル中...
test.c
D:\Home\test.c(8) : warning C4101: 'h' : ローカル変数は 1 度も使われません。
D:\Home\test.c(7) : warning C4101: 'i' : ローカル変数は 1 度も使われません。
リンク中...

test.exe - エラー 0、警告 2


 こうなる。
 警告は出るが、エラーは消える。

 あるいはファイル拡張子を.cから.cppに変更(test.c → test.cppにリネーム)してもエラーを消すことができる。

 この理由がわからなくてちょっと悩んだんですけど、調べてみると1999年12月1日にC言語がISO/IEC 9899:1999 - Programming Language C(略称 C99) として規格化されたときに仕様の変更があり、変更前の仕様だとエラーになり、変更後の仕様だとエラーにならないようです。

 http://seclan.dll.jp/c99d/c99d07.htm
 ↑
 こちらのURLを参考にしました。助かりました。「7.7 変数宣言と実行コードの位置関係」に詳しい解説があります。

まとめ:
・古い仕様だと変数の宣言はブロックの先頭(関数、if、elseなどの最初)で行う必要がある。
・新しい仕様だとその変数が実際に使用される前であればどこでも構わない。
・C++は新しい仕様と同様。今回の例だとtest.cをtest.cppとリネームするとC++だと認識されてエラーは出なくなる。

 古い仕様、新しい仕様、C++、いずれのやり方でビルドされるか? はコンパイラとコンパイルオプション、それからファイル拡張子で決まり、古いコンパイラだと古い仕様、新しいコンパイラでも古い仕様でビルドするオプションを指定すれば古い仕様、拡張子がcppだとC++のファイルだと認識され、C言語ライクな書き方をしてもエラーにはならないのではないかと思います。
(きちんと調べていません)

すばらしいプレゼンテーション

 

 まったく同じ悩み(上達しない、MLこわい、etc...)を抱えながら毎日を過ごしているので、とてもとてもとても勇気づけられた。噂には聞いていたけれど、なんて温かいプレゼンテーションなんだろう。スティーブ・ジョブズ的神懸かり系プレゼンテーションとはまた異なる種類の感動、異なる種類の発見のあるすばらしいプレゼンテーションだと思った。俺もがんばろう!!

まだ観ていませんが。

 20080818a

 映画版スカイ・クロラのオフィシャルサイトで好きな肩書きと名前を指定して名刺を作ることができるので、いろんな人が遊んでいるようです。プライベートで連絡先とか交換するときにこういうのをさっと出せるとちょっと素敵かもしれません。いいなぁ。プリンタがあるのいいなぁ。

 肩書き欄にキルドレ=Kirudoreって書いている人がいたんですけど、例えば、「女王の百年密室」でアンドロイドのことを「ウォーカロン(Walk alone)」と書いていたことから類推するに Killing Children とか Killer Children とかいったものが諸々短縮されて Killdre でキルドレだろうと勝手に思いこんでいたので若干の違和感が。

 サンプル画像の肩書き欄に予想される指摘への回答:野望は大きく。

Ruby で UTF-8 の全角文字列を Shift_JIS に変換する方法

 Windows 環境下で全角文字列を処理していて、ちょっと詰まったのでメモ。

■ソース
require 'nkf'
puts "ああああ"
puts NKF.nkf("-sm0W8x", "ああああ")


■実行結果
縺ゅ≠縺ゅ≠
ああああ


 Windows のコマンドプロンプトやら何やらは Shift_JIS で、Meadow さんは UTF-8 なので、素の全角文字列そのまま puts すると化ける。なので、NKF を使って Shift_JIS に変換してから puts してあげる。恥ずかしながらnkfを使ったことがなかったのでオプションを特定するまでに手こずった。これで Excel だとか CSV に DB の内容をはき出すような処理も大丈夫。

■参考にさせていただいたURL
・nkf - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/nkf.html
よく読むと必要なことは(多分)すべてここに書いてあるけど、リファレンスなので読み解くのが少し面倒。

・UTF-8で書かれたファイルをshift-jisに変換したい -OKWave
http://okwave.jp/qa3357525.html
なので、Ruby の NKF.nkf でなく、普通の nkf で UTF-8 → Shift_JIS 変換するケースを調べたら見つかったので、ここからオプションの指定方法(-sm0W8x)をいただきました。

・Life with Cygwin 5 (5.4 nkf コマンド)
http://www.okisoft.co.jp/esc/cygwin-5.html
文字列単位でなく、ファイル単位でよければ nkf や iconv を外部コマンドとして使う方法のほうが簡単かもしれない。

■その他
以前、Windows から DVD-R 経由で Ubuntu に MP3 ファイルをコピーしたときにファイル名がことごとく文字化けしたときは convmv を使った。ファイル名の変換であれば、外部コマンドで convmv を使ったほうがずっと簡単だと思う。

WinampでFLVファイルを再生できるようにした。

 基本的には、

 WinampでYouTube動画(*.FLV)を見る方法
 http://www.playnote.net/archives/000750.html

 の通りにやればOKでした。
 いくつか。

 FLVSplitter.7z への直リンクが404になっているので、ググッて http://cowscorpion.com/Codec/FLVSplitter.html から落としました。同様にFFDShowは http://cowscorpion.com/Codec/ffdshow.html ここから。WinAmpにNullsoft DirectShow Decoder v1.0が見つからなかったので、

 Winamp5のプラグイン(Winamp2.95以降更新追加されたもの)
 http://www.geocities.co.jp/SiliconValley-Bay/7045/wa5plugin.html

 から「dshow098b.zip (5.23付属) ○2.95 」をダウンロード。C:\Program Files\Winamp\PluginsにコピーしてWinampを再起動したら出てきました。

 iTunesは以前愛用していたんですが、糞重いのとどうでもいいサービスを3つも動かしてくれるので使うのをやめました。

FC2ブログのファイルアップロードがときどき失敗するので

 20080804d

 僕のところだけかもしれないけど、なぜかときどきアップロードに失敗してしまう。調べるのが面倒なのでFlickrのアカウントを取った。使いやすさが段違い! ファイルアップロードを使うことは金輪際ないだろう。

マウスを買ってきた。

20080804 026

20080804 027

20080804 028

 真っ黒いのが新しいほう。
 たかがマウスでも新しいものは嬉しい。

 「刀・鉄黒・硯」イメージしたマウス エレコム
 http://www.j-cast.com/mono/2008/05/02019686.html

 上記の「硯」です。

マウスの左クリックの調子が悪いので

 どうも左クリックをしたつもりが左ダブルクリックになったり、ウィンドウをドラッグしているときボタンを押しっぱなしなのに途中でウィンドウが止まったり、どうも左クリックが正しく認識されない。

 なので、PCの調子が悪いときにそうするように分解してみた。綿棒でゴミを取り、おかしなところはないか、なんとなく見てみて、特にないようなので組み上げる。











 右クリックが完全に死亡しました。

 写真撮ったのにUPできない。

ヤック・デカルチャー!

 

 

 原曲よりアレンジ版のほうが50倍くらい好きだ。

 綺麗にボーカルだけ抜いていたり、リズムまであわせていたり、最後に転調してみせたり、テクニック的にも見どころ盛りだくさんというか素直に超すげえです。

«  | HOME |  »

プロフィール

志田

Author:志田
どこにでもいるIT土方です。
詳細はこちらを。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード