D言語でC言語のexitにあたる関数


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/1/9 21:20
DimeRP  新米   投稿数: 5
初めまして。ディムRPと申します。

質問していいのか?と少し迷ってましたが、
初心者なので分からないことは上級者に聞くのが一番と思い、投票します。

んじゃ、本題なんですけど。
自分はD言語の勉強に[[Programming Place:http://www.geocities.jp/ky_webid/index_old.html]]様のC言語で書かれた講座をD言語に移植してるんです。

そこで、タイトルの通り「D言語でC言語のexitにあたる関数」を探してまして。
一応「assert(0)」に置き換えたのですが。

でも何か違うような気がするので、
他に「D言語でC言語のexitにあたる関数」は知りませんか?
というか有りますか?

お願いします。
投票数:73 平均点:5.34
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/1/10 2:11
SHOO  管理人   投稿数: 658
>質問していいのか?と少し迷ってましたが、
>初心者なので分からないことは上級者に聞くのが一番と思い、投票します。

正味な話、「おしえて!goo」にD言語の質問スペースがあったなら、もしかしたらこのサイトは存在しなかったかもしれません。
大歓迎ですよ!

>他に「D言語でC言語のexitにあたる関数」は知りませんか?

C言語の標準ライブラリにある関数はD言語でも当然利用可能です。
exit関数はcore.stdc.stdlibに存在します。

が、これを使うよりも例外でErrorクラスを継承したクラスを投げた方がDっぽい気がしないでもありません。((Tangoの場合はErrorクラスが無いのでException))
あるいは直接、単純にErrorクラスを例外として投げるとか。
#code(d){{{
throw new Error("復帰不可能(とおもわれるよう)な例外の理由");
//throw new Exception("復帰可能(とおもわれるよう)な例外の理由");
}}}

参考URL:
http://www.kmonos.net/alang/d/2.0/errors.html

C言語の標準ライブラリにある関数を探す場合、簡単な方法は、grepツールを使ってdmdでimportしている場所をさらってしまうのが一番楽です。
投票数:88 平均点:4.43
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/1/10 11:58
DimeRP  新米   投稿数: 5
おはようございます。
そして回答して頂きありがとうございます、SHOOさん。

引用:
正味な話、「おしえて!goo」にD言語の質問スペースがあったなら、もしかしたらこのサイトは存在しなかったかもしれません。
大歓迎ですよ!
なるほど、というか大歓迎ですか。
まだまだ未熟者なのでお手数かけますm(_ _)m

引用:
C言語の標準ライブラリにある関数はD言語でも当然利用可能です。
exit関数はcore.stdc.stdlibに存在します。
ええ? それってつまりD言語でC言語の標準ライブラリを使えると言うことですよね?
ちょっと調べて試しに使ってみます。

引用:
が、これを使うよりも例外でErrorクラスを継承したクラスを投げた方がDっぽい気がしないでもありません。*1
あるいは直接、単純にErrorクラスを例外として投げるとか。
なるほど。&font(Blue){Error};クラス。
確かにこちらの方が、Dっぽくて良い。
assertはC言語でもあるので、使ってもD言語って感じがあんまりしないので。
まぁ、でも結局は使い易いから使っちゃうんですけどね^^

SHOOさん、参考リンクまで貼って頂きありがとうございました。
作ったプログラムをさっさく、
「assert(0)」から「Errorクラス」に置き換えて、
試してみたいと思います。
投票数:49 平均点:5.10
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/1/10 12:54
SHOO  管理人   投稿数: 658
>assertはC言語でもあるので、使ってもD言語って感じがあんまりしないので。

勘違いしてしまったとしたら申し訳ないのでassert文についてすこし…((もしわかりきっていることだとしたら申し訳ありませんが))

assert文を利用しているからCっぽいという意味ではありません。
exit関数やabort関数は、throwなどがあるため、普通D言語では利用しないとは思いますが…

assertはD言語の機能の中でも、契約プログラミングを行う上で比較的重要な役割を持っています。
D言語のassertは、C言語のassertとは違い、言語組み込みの機能となっています。(C言語のassertはマクロです)
使い方はC言語のassertと同様ですが、今回のように、プログラムを途中でabortするために利用して良い機能ではありません。
assertは、絶対に真にならなければならない条件を記述する機能となっています。assert(0)の場合は、その場所には絶対に来ないことを表明するためのものです。
また、assert文はリリースコンパイル時には実行されません。つまり、実行されないと困ることを書くことはできません。

#code(d){{{
while (1) {
// iは必ずary.lengthより小さい。
// そうでない配列はここに来ることは有り得ない。
// (つまり配列内に必ず100という数値が含まれる)
assert(i < ary.length);
if (ary[i++] == 100) return 0;
}
// 必ずwhile文の中でreturnされる。
// これ以降が実行されることは有り得ない。
assert(0);
}}}

などのように使います。
簡単に言うと、「絶対にこうなっていなければおかしい」という表明文を書くことで、もし万が一プログラマの勘違いやミスで「そうなっていなかった場合」に、プログラムを強制終了することでバグを気づきやすくするためのツールです。

参考:
http://www.kmonos.net/alang/d/2.0/dbc.html
投票数:85 平均点:5.18
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/1/11 7:09
ゲスト 
引用:
assertはD言語の機能の中でも、契約プログラミングを行う上で比較的重要な役割を持っています。
D言語のassertは、C言語のassertとは違い、言語組み込みの機能となっています。(C言語のassertはマクロです)
確かにC言語では<assert.h>をインクロードして「assert()」マクロを使用する、でしたよね?
でD言語は組み込みだから、外部からインポートしなくてもオーケー。

けれど、そういうことは「assert」を使い始めて直ぐに知りました。
(裏を返せば、最初に使ったときに、import assert と書いてしまい。
コンパイルに怒られた。)

引用:
使い方はC言語のassertと同様ですが、今回のように、プログラムを途中でabortするために利用して良い機能ではありません。
assertは、絶対に真にならなければならない条件を記述する機能となっています。assert(0)の場合は、その場所には絶対に来ないことを表明するためのものです。
また、assert文はリリースコンパイル時には実行されません。つまり、実行されないと困ることを書くことはできません。
ああ、なるほど。大体、分かりました。
つまり要約すると、「''強制終了するために利用するのは賢い使い方ではない。assert(0)はここに来るはずないというプログラマーへのフラグであり。更にはassert文はリリース時には意味がないので、終了を渡したければthrowが普通というか適切''」と。

引用:
などのように使います。
簡単に言うと、「絶対にこうなっていなければおかしい」という表明文を書くことで、もし万が一プログラマの勘違いやミスで「そうなっていなかった場合」に、プログラムを強制終了することでバグを気づきやすくするためのツールです。
つまり簡単にデバックするためのモノであり、プログラマーお助け機能という事ですね。
うむむ、それなら使いこなせないと損ですな。
というかD言語の目玉の一つなので、これは利用しなければ。

引用:
もしわかりきっていることだとしたら申し訳ありませんが
全然、分かっていなかったので、とても助かりました。
C言語でも初級者でさえ行けなかった脱初心者なので、
こういう事をドンドン言ってもらえると、とても助かります!

SHOOさん、何回もありがとうございました。
ここに質問して良かったです!
投票数:125 平均点:3.28
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/1/11 7:12
DimeRP  新米   投稿数: 5
スミマセン。
[[上のゲスト。自分です。:http://dusers.dip.jp/modules/forum/index.php?post_id=183]]。

ログインするの忘れてました。
投票数:96 平均点:4.90
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu