私は現在、&要素をグラフで検索するプロジェクトに取り組んでいます。私はigraphパッケージが私の単純なニーズにはかなり良いと思っていましたが、私はJavaを扱うのに慣れていたので、いくつかのことは明らかではありません。あまりにも多くの鋳造を避ける
なぜ、igraphパッケージを作成した人は、整数のような基本要素を 'igraph_integer_t'として再定義するのでしょうか? ライブラリの関数を呼び出すたびに、すべてを整数にキャストしなくても済むようにする方法はありますか?
私は現在、&要素をグラフで検索するプロジェクトに取り組んでいます。私はigraphパッケージが私の単純なニーズにはかなり良いと思っていましたが、私はJavaを扱うのに慣れていたので、いくつかのことは明らかではありません。あまりにも多くの鋳造を避ける
なぜ、igraphパッケージを作成した人は、整数のような基本要素を 'igraph_integer_t'として再定義するのでしょうか? ライブラリの関数を呼び出すたびに、すべてを整数にキャストしなくても済むようにする方法はありますか?
私はこのパッケージがわからないが、自分のアプリケーションでigraph_integer_tを使用するか、igraphの周りに通信するためのフレームワークを構築する必要があります。
間違ったサイズの整数(短いものと長いもの、署名されたものと署名されていないものなど)を使用すると、見つけにくい本当に風変わりなバグが発生することがあります。私は、使用しているライブラリとコンパイラに適切なサイズのintを選択するigraphとやりとりするためのフレームワークを構築します。私はあなたが安全でなければならないことを知っているこのフレームワーク以外のキャスティングを避けるでしょう。
一言で言えば、抽象レイヤーを追加します。
これは単にライブラリの作者による壊れた習慣です。正当な言い訳はありません。特定のサイズの整数型が必要な場合、そのAPIはそのサイズの標準型を使用する必要があります。 'int32_t'。プラットフォームによって異なる「通常の」整数サイズが必要な場合は、int型またはlong型で、これらの型のいずれかを使用する必要があります。 –
@R ..確かに同意しますが、ライブラリーを使用する必要がある場合は、手元の問題を解決できません。 –
です。 'igraph.h'か何が呼び出されたのかを見て、' igraph_integer_t'の定義を見つけてください(99%は単に 'int'です)、そしていつものように' int'を使います。 –
これは、正当な理由がないにもかかわらず、ライブラリの多くの嫌な習慣です。タイプは、igraph_integer_t
です。私が期待しているのがint
の場合は、どこでもint
を使用し、igraph_integer_t
のふりは存在しません。キャストは絶対に必要ありません。とにかくすべての整数型(および浮動小数点型)はCで暗黙的に変換され、C typedef
型はその定義とは区別されません。
igraphの著者の一人として、私はこれがプロジェクトの最初の段階でなされた疑わしい設計上の決定であることを認識しています。初期の意図は、実際には「抽象レイヤーを追加する」ことでした。アプリケーションがint
のどこにあってもオーバーフローの問題が発生する前に科学的ソースコードを使って作業しましたが、int
をすべてソースコード全体に置き換えなければなりませんこのプログラムは私たちが提示した問題を扱っています。そのため、単純にint
またはlong
の代わりにigraph_integer_t
が表示されます。igraph_integer_t
データ型が問題に対して小さすぎる場合、ソースコード内の1つの場所のみを変更する必要があります。
上記のシナリオは非常にまれですので、おそらくかなり弱い議論です。すべてのプラットフォームでlong
のデータ型では不十分な場合があるため、igraph_integer_t
はdouble
にtypedefされます。 (私が考えることのできるシナリオの1つは、大きなグラフのモチーフを数えることです - モチーフの数は整数ですが、古いプラットフォームのデータ型の制限を簡単に超えることができます)。 igraph_integer_t
についての決定がなされた当時のプロジェクトの周りではなかったので、それは正確な理由ではない可能性があります。もしあなたが落ち着きに興味があるなら、igraph-help mailing listでお気軽にお問い合わせください。とにかく、私はigraphのCコアを直接使用しています(私はPythonラッパーを担当しています)ので、igraph_integer_t
と他のデータ型の間でキャストする必要はないと言うことができます。
printf
にigraph_integer_t
の値を使用する場合。igraph_integer_t
をlong
にキャストし、フォーマット文字列に%ld
を使用するかキャストしないでフォーマット文字列に%g
を使用する必要があります(暗黙のうちにigraph_integer_t
がdouble
になっています)。
igraph_integer_t
で配列にインデックスを付ける場合。あなたは明らかにそれをlong
にキャストしなければなりません。
うわー。ちょうどうわー。型 "integer"の名前をつけ、それを浮動小数点型として定義する。あなたが言うように、配列の問題だけでなく、 '%'演算子の完全な失敗や '/'演算子の誤動作も、明らかではない多くの失敗につながります。少なくともそれがおそらく悪い考えであったことを認めてくれてありがとう。 –
ところで、ソースからの非常に有益な答え+1。 –
誰かがこれをまだ読んでいる場合、 'igraph_integer_t'はソース内の' int'にtypedefされ、 'double'にはtypedefされません。 –
http://igraph.sourceforge.net/ – poolie
CはC++ではありません。整数型または浮動小数点型のキャストを使用する必要はありません。 –