【雑談】ベターC用のライブラリ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかぎ

【雑談】ベターC用のライブラリ

#1

投稿記事 by たかぎ » 15年前

C++をベターCとして使っている人が意外に多いようですので、実験的にベターC用のライブラリを一部だけ作ってみました。
今のところ、<stdlib.h>を拡張した<betterc/stdlib.h>だけです。
bettercディレクトリを作って、そこに添付したファイルを格納してください。そして、インクルードディレクトリを設定してください。
文字コードはUTF-8ですので、必要に応じて変換してください。
ヘッダファイルをインクルードするだけで使えますので、ライブラリファイルをリンクする必要はありません。

ざっとライブラリの説明をすると...

一番力が入っているのが strto関数テンプレートです。
これは、strtolやstrtodなどを一般化したもので、

long value = betterc::strto<long>("12345");

のようにして使います。
もちろん、第二引数や第三引数を指定することもできます。
betterc::strto<double>とすれば浮動小数点型も使えますが、C99の0x1.234p+3のような形式にも対応しています。
ただし、ロケールは未対応ですので、小数点には . しか使えません。
また、ナロー文字列だけでなく、ワイド文字列や、C++0xのchar16_tやchar32_tの文字列も指定できます。

ほかには、betterc::abs関数に、例えば INT_MIN を指定すると、assertを埋め込んでいますのでエラーを検出できます。
betterc::div関数の除数にゼロを指定したり、betterc::div(INT_MIN, -1)のようにした場合もエラーを検出できます。

多バイト文字・ワイド文字間の変換は、現状ではUTF-8しか対応していません。

なお、ざっとしかテストしていませんし、Mac OSX上のGCC(バージョン4.0.0, 4.4.0, および4.5)でしか試していません。
時間のあるときにでも触ってみて、ご意見をいただけると幸いです。
画像

たかぎ

Re:【雑談】ベターC用のライブラリ

#2

投稿記事 by たかぎ » 15年前

ファイル添付がうまくいかなかったようです。 画像

たかぎ

Re:【雑談】ベターC用のライブラリ

#3

投稿記事 by たかぎ » 15年前

早速バグが見つかりました。
std::getenvがNULLを返した場合の処理が入っていませんでした。
ある程度まとめて修正を行いたいと思います。

sizuma

Re:【雑談】ベターC用のライブラリ

#4

投稿記事 by sizuma » 15年前

>bettercディレクトリを作って、そこに添付したファイルを格納してください。そして、インクルードディレクトリを設定
こういうことってしたことなかったから、試行錯誤しました^^;
結局文字コードが原因で動かなかったのかな?とりあえずコメント消したら動くようになりました。
文字コードを変換するのはどうやったら出来るのでしょうか?
テキストエディタで出来るかな?と思ったら見当たらなくて出来ませんでした。
VisualC++なんですが、VCの設定で変えるのでしょうか?


strtoだけでもトレースしてみようと思ってみてるんですけど、難しくてわからないとこだらけです。
関数テンプレート使ったことがないんで、見慣れてない部分もあり読むのに時間がかかります・・・


>detail::space_and_sign(s, s)
こんな使い方をするんですね、ポインタって。
CharT const *& next
これって一見すると**nextがconstに見えるんですが、*nextがconstなんですね。


>std::numeric_limits<T>::is_integer
なんか見たことあるテンプレートだなぁ・・・と思って検索したらきじねこ様のページがヒットしました
あぁ、ここで見たのか、と(笑


あと、こういう風に使うと
double value = betterc::strto<double>("123.45");
ctoiで'.'が変換されないから、初期化されないvalueを使うって実行時エラーが出ます
(使い方が間違ってるのかもしれないですけど・・・)
// 整数部
while (charT c = *s)
{    
    int d = ctoi(c);
    if (d >= radix)
        break;
    if (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer
        && minus)
    {
        if (value * radix < std::numeric_limits<T>::min() + d)
            throw std::overflow_error("overflow");
        value = value * radix - d;
    }
    else
    {
        if (value * radix > std::numeric_limits<T>::max() - d)
            throw std::overflow_error("overflow");
        value = value * radix + d;
        }
    ++s;
    if(*s == decimal_point)break;//二重にdecimal-pointの判定をしてしまうけれど・・
}
あれ?
コード眺めてたら2時間ぐらいたってる・・・
ちなみにたかぎさんはこのヘッダを作るのにどれくらい時間かかったのですか? 画像

たかぎ

Re:【雑談】ベターC用のライブラリ

#5

投稿記事 by たかぎ » 15年前

Visual C++ 2008でも使えるように手直ししました(サロゲートペアは非対応)。
あと、mblenなど少し関数を追加したほか、気づいた不具合を直しました。

たかぎ

Re:【雑談】ベターC用のライブラリ

#6

投稿記事 by たかぎ » 15年前

> strtoだけでもトレースしてみようと思ってみてるんですけど、難しくてわからないとこだらけです。

std::pow周りを除けば、割と素直なつくりです。
strtolとstrtodの定義を合体させると、大体こんな感じになります。
std::pow周りは最初素直に書いていたのですが、GCC 4.0.0でエラーになるので、無理やり対応しました。

> あと、こういう風に使うと
> double value = betterc::strto<double>("123.45");
> ctoiで'.'が変換されないから、初期化されないvalueを使うって実行時エラーが出ます
> (使い方が間違ってるのかもしれないですけど・・・)

バグでした。
ちゃんと解析していませんが、それっぽい修正をしておきました。

> ちなみにたかぎさんはこのヘッダを作るのにどれくらい時間かかったのですか?

計っていませんが、のべ半日ぐらいかと思います。
# だからまともにテストができていない。

たかぎ

Re:【雑談】ベターC用のライブラリ

#7

投稿記事 by たかぎ » 15年前

ちょっと触ると、今度はGCCでコンパイルできなくなっていたので、再度手直ししました。
一応、シフトJIS版とUTF-8版の両方を入れたものをアップロードしておきます。
本腰を入れる余力はないのですが、いい加減な取り組みだと収集がつかなくなりそうです。

sizuma

Re:【雑談】ベターC用のライブラリ

#8

投稿記事 by sizuma » 15年前

>計っていませんが、のべ半日ぐらいかと思います。
よかった。1、2時間って言われたらショックが大きすぎますんで・・・・
やっぱり自分と比べて考えてしまいますからね(おこがましいのは置いておいて)
僕なら何日かかって作るかな、って思ってしまいます。

>修正版
また明日にでもトレースしてみます。

閉鎖

“C言語何でも質問掲示板” へ戻る