路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

XCode入門中

2005-09-30 20:26:50 | プログラミング
プロダクトをOSXに移植するためにXCodeの勉強を始めました。
Visual Studioにどっぷり浸かっていたせいか、いろいろ戸惑ってます。

XCodeでboostを使う (2005/09/30)
ーー> プロジェクトのInfoのBuildタブでHeader Searach Pathsを設定する

XCodeのエディタでバックスラッシュを入力する (2005/09/30)
ーー> [option] + [¥]

zlibを使う (2005/10/04)
ーー> コンパイルはできても、実行しようとすると「ZeroLink: unknown symbol・・・」とエラーが出る。
コマンドラインからgccを使って、-lzとすると大丈夫。
まだ原因不明。


VS2005RC雑感 - シングルスレッド廃止?(T◇T)

2005-09-30 17:00:44 | プログラミング
VS2005RC英語版をダウンロード、インストールしてみました。

VS.NETのプロジェクトを開いて変換、ビルドすると・・・

エラーチェックが厳しくなってます。VS.NETでは文句を言われなかったソースでしたが、VS2005は2つエラーを出しました。暗黙のintはだめ。メンバ関数のアドレスを取るには、関数名だけではだめで、「&クラス名::関数名」としろ。とのことでした。これはちょっと嬉しい。

その後、プロジェクトのプロパティを調べてみると、シングルスレッドのはずが、いつの間にかマルチスレッドに変更されています。元に戻すことができないというか、そもそもシングルスレッドという選択肢がありません。なぜだー。

まあそれはあきらめて(今のPCではパフォーマンス的にはかなり痛いけれど、一億総マルチコア時代には、まあこれが普通なのでしょう)、回帰テストしてみると、テスト通らないー。

原因は、オブジェクト解放のタイミングがVS.NETと微妙に違うことのようです。boost::formatの一時オブジェクトが早めに解放されてしまい、ヌルポインタエラーで落ちてました。

この様子だと、移行はかなり先になりそう。無理して年内に出さなくても、VS2007位でもいいですよ。それよりVistaを先にお願い。> MSの方々


C#2.0のテンプレートは期待して良い?

2005-09-30 01:33:59 | プログラミング
そろそろVisual Studio 2005 RCの足音も聞こえてくる今日この頃、気になってちょっとC#2.0を調べてみました。記事1記事2

Genericsで重要なのは、以下の3つだと思います。
1. 型のパラメタライズ
2. 特殊化
3. 型の制約記述

C++のテンプレートは1と2をサポートし、JavaのGenericsは1と3をサポートします。

2の特殊化がC++のテンプレートに取り入れられた理由は、テンプレートの「オーバーロード」(例えば、組込型とオブジェクト型で違うコードを使ってほしいといった要求に応える)を可能にするためでした。その後、特殊化は再帰テンプレートという技術に応用され、コンパイル時に計算されるコードの記述に使われることになりました。

3の型の制約記述は、テンプレートを型システムと整合させる(単なるマクロの代替として使うのではなく)のに重要な機能ですが、C++ではサポートしていません。

上述の記事を読む限り、C#2.0のテンプレートは1, 2, 3のすべてをサポートするようです。C#2.0のテンプレートがちゃんと機能して、うまくは流行れば、そのうちメタテンプレートライブラリがごそっと移植されて・・・うーん。後はMonoProjectがC#2.0に追いついてくれればなあ・・・。(MonoProject、いつの間にか、2.0の実装をほぼ完了“almost complete for 2.0”だそうです。早い。2005/10/06)

追記 2005/10/13
記事「動的プログラミング言語へと発展するC# 3.0とVB 9.0」によると、どうやら、C#3.0では、独自の道を行こうとしているようです。上記1, 2, 3にくわえて、型推論、および、ラムダやLINQといったこってりしたシンタックスシュガー。ここまでくると、本格的に、コンパイラのエラーメッセージが可読かどうか気になる・・・

オブジェクト指向alloca (alloca_array)

2005-09-27 14:13:19 | プログラミング
Boostのarray.hppをまねて、スタックからメモリを調達する配列を作ってみる。その名もalloca_array。 

機能: 
・スタック上に、動的にサイズが決定される配列を作る 
(いったん作られた後は大きさを変更できない)。 
・STLコンテナである。begin()やらend()やらが提供される。 

--------------- alloca_array.hppここから --------------- 
#if ! defined ALLOCA_ARRAY_H

#include <cassert>
#include <cstddef>

#if defined _MSC_VER

#include <malloc.h>
#define alloca _alloca

#elif defined _GCC

#include <alloca.h>

#else

#error "unsupported compiler"

#endif

#define DECL_ALLOCA_ARRAY(variable, ElemType, count) alloca_array<ElemType> variable(alloca(count * sizeof(ElemType)), (count))

template<typename ElemType>
class alloca_array {
public:
    typedef ElemType value_type;
    typedef ElemType *iterator;
    typedef const ElemType *const_iterator;
    typedef ElemType &reference;
    typedef const ElemType &const_reference;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
private:
  ElemType *buf;
  size_type buf_size;
public:
  alloca_array(void *alloca_buffer, size_t count)
    : buf(NULL), buf_size(0)
  {
    buf = reinterpret_cast<ElemType *>(alloca_buffer);
    for (size_t i = 0; i < count; ++i) {
      new(&buf[i]) ElemType();
    }
    buf_size = count;
  }
  ~alloca_array()
  {
    for (size_t i = buf_size; i-- > 0; ) {
      buf[i].~ElemType();
    }
  }
  reference operator[](size_t index)
  {
    return buf[index];
  }
  const reference operator[](size_t index) const
  {
    return buf[index];
  }
  iterator begin()
  {
    return &buf[0];
  }
  iterator end()
  {
    return &buf[count];
  }
  const_iterator begin() const
  {
    return &buf[0];
  }
  const_iterator end() const
  {
    return &buf[count];
  }
  
  // swap (note: linear complexity)
  void swap (alloca_array<ElemType> &y) {
    std::swap_ranges(begin(), end(), y.begin());
  }

  const ElemType* data() const 
  { 
    return buf; 
  }
  ElemType *c_array() 
  { 
    return buf; 
  }
  template <typename T2>
  alloca_array<ElemType> &operator= (const alloca_array<T2> &rhs) {
    std::copy(rhs.begin(), rhs.end(), begin());
    return *this;
  }
  size_type size() const
  {
    return buf_size;
  }
  bool empty() const
  {
    return buf_size > 0;
  }
  reference at(size_type i) 
  { 
    rangecheck(i); 
    return buf[i]; 
  }
  const_reference at(size_type i) const 
  { 
    rangecheck(i); 
    return elems[i]; 
  }
  void rangecheck (size_type i) const
  {
    if (i >= buf_size) { 
      throw std::range_error("alloca_array<>: index out of range");
    }
  }

};


#endif // ALLOCA_ARRAY_H
--------------- alloca_array.hppここまで --------------- 

テスト用コードを以下に。うまく動いてるみたいです。 

--------------- aatest.cppここから --------------- 
// allocatest

#include "alloca_array.hpp"

#include <string>
#include <cassert>

int main(int argc, char *argv[])

  const int size = 100;

  DECL_ALLOCA_ARRAY(astr, std::string, size);
  astr[0] = "";
  for (size_t i = 1; i < astr.size(); ++i) {
    astr[i] = astr[i - 1] + std:: string("a");
  }
  for (size_t i = 0; i < astr.size(); ++i) {
    assert(astr[i].length() == i);
  }

  DECL_ALLOCA_ARRAY(aint, int, size);
  for (size_t i = 0; i < aint.size(); ++i) {
    aint[i] = i;
  }
  for (size_t i = 0; i < astr.size(); ++i) {
    assert(aint[i] == i);
  }

  return 0;

--------------- aatest.cppここまで --------------- 

反省点と弱点 

・プリプロセッサマクロを使っている。∵関数にするとスタックフレームが新たに作られてしまってallocaが役に立たないから。 
・C99ではallocaなんか使わなくてもスタック上に配列を確保できるから、その機能を利用するようにarray.hppを修正したら、alloca_arrayは不要なのでは(お 

(2005/09/28) 文字化けしていたので、いくつかの半角文字を全角文字で置換。orz

とりあえず自分の環境を紹介

2005-09-26 20:10:00 | その他
*OS
Windows XP

*開発
MSDNエンタープライズ
Eclipse 3.1
J2SDK 1.5.0.04
Bz (バイナリエディタ)
Dependency Viewer
DF (diff)
UnxUtils

*ドキュメント
Atok
atazik
Adobe Acrobat
PrimoPDF
MS Office
PDIC +英辞郎
マウスもキャプチャ
GraphViz
ImageMagick

*セキュリティ
SpywareBlaster
AntiVir XP
Ad-Aware SE Personal
AVG Free
SpyAudit

*通信・ブラウザ
SSH Secure Shell Client
Firefox
TidyFTP
GikoNavi
Irvine
Becky!
BkASPI
Port Monitor

*プレーヤー
WinDVD
MediaPlayer
QuickTime
RealPlayer
FlashPlayer
ShockWave
Hamana

*ユーティリティ
PerfectDisk
SmartClose
UnplugDrive
Lhaz
FastCopy
Aladdin Expander
7-zip
HDD Health
いつでも天気
CD2WAV32
Daemon
DVD Decriptor
GetASFStream
TauProducer
エキサイト壁紙
圧縮フォルダ表示制御ツール
スタートアップチェッカー
TMPGEnc Editor 1.x
Googleデスクトップ

こんなもんかな。

1件追加。1件修正(トラックバックで気がつきました。感謝します)。でもトラックバックって何なのでしょう?初心者だ/(^◇^;)(2005/10/04)

2件追加。今日ウイルスチェックしたら、78個も見つかってブルー。(2005/10/06)

2件追加。(2005/10/22)