電子書籍の厳選無料作品が豊富!

前回回答いただいた皆さんありがとうございました。
自分なりに勉強したところ、柴田望洋著 新・明解C言語によるアルゴリズムとデータ構造

のp105に解説を発見し、kmeeさんの回答からキャストの定義を学び、理解できました。

第5引数の比較関数なのですが、定義で int *int_cmp(const int *a, const int *b)

とint_cmpの前に*は要らないのでしょうか。。ただ第5引数にint_cmpと書けばint_cmp関数の先頭アドレスが参照されることになってるんでしょうか。

それと MillenniuM さんの宿題のような比較関数

int int_cmp(const void* x, const void* y) {
return *(int*) x - *(int*) y;
}

の*(int*)x - *(int*)y;
の部分をVisualStudio2013でデバッグ解析しようとすると
msvcr120d.i386.pdbが見つからない~というようなことを言われてその部分の動作を解析できません。。(コンパイルはできます)
このvsでコンパイルできない理由と意味をどなたかご教授頂けないでしょうか

A 回答 (7件)

>msvcr120d.i386.pdbが見つからない~というようなことを言われてその部分の動作を解析できません。

。(コンパイルはできます)
>このvsでコンパイルできない理由と意味をどなたかご教授頂けないでしょうか

自分で書かれてて違和感ありませんでした?
「コンパイルできます」といってるのに「コンパイルできない(理由)」って何?

bsearch呼び出す前からステップ実行しててbsearchの処理の中に入ってってるだけじゃないかなぁ。
bsearchのソースデバッグのための情報はないでしょうから。
int_cmpにブレイクポイント設定して一気に実行させればいいだけかと。

この回答への補足

すいません日本語間違えました。でも日本人です。。

>bsearchのソースのデバッグのための情報はないでしょうから。

この「デバッグのための情報」というのはなんなのでしょう

以前別のプログラムをvs2005でステップインしようとしてもデバッグ情報がありませんみたいな
ことを言われて逆アセンブルになっちゃったのですが、、この辺のコンパイラの挙動の勉強って
どういう書籍、サイトをみればよいでしょうか。。

補足日時:2014/03/18 21:21
    • good
    • 0
この回答へのお礼

第5引数ではなくbsearch関数が別になってるからですね。
今見るとこの回答がベストアンサーです。ありがとうございました。

お礼日時:2014/03/23 19:52

関数名を書くと, 一部の例外を除き自動的に「当該関数へのポインタ」に変換されます.



配列名を書いたときに (これも一部の例外を除き) 自動的に「先頭要素へのポインタ」に変換されるのと同じ.

だから, ただ単に int_cmp と書けば (「例外」でなければ) その関数へのポインタとなりますが, この「関数へのポインタ」は #1 にもあるように &int_cmp と書いても同じように得ることができます.
    • good
    • 0
この回答へのお礼

第5引数がダメなんじゃなくてbsearch関数のソースがないって言ってるんですね
もう少し勉強します。。

お礼日時:2014/03/23 19:50

>以前別のプログラムをvs2005でステップインしようとしてもデバッグ情報がありませんみたいな


>ことを言われて逆アセンブルになっちゃったのですが、、この辺のコンパイラの挙動の勉強って
>どういう書籍、サイトをみればよいでしょうか。。

簡単にいえば、デバッグ対象のプログラムをコンパイルする際にソースからコンパイルしていない部分に関してはステップ実行時には逆アセンブルになります。
元のソースがないわけですしソースとの対応もわからないんですから。

もっと極端にいうなら、あなたがソースコードを用意してコンパイルした部分だけがソースレベルでステップ実行などできる部分です。

>あ、それで\VC\srcの中のdllファイルを指定すればデバッグ可能になるのですね
>この辺は2013になっても自動では認識してもらえないということですか。

なりません。
そこにはソースがあるだけです。
コンパイル対象に含めればできるとは思いますけどbsearchなどの標準関数を何のためにデバッグするんですか?
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます
デバッグは語弊ですすみません
あくまで途中の値とかどうなってるか挙動を解析して
理解したいのです
またよろしくお願いします

お礼日時:2014/03/19 11:32

> それとも今からCは流行らないのかな・・・



デバッグ云々とCの流行り廃りとは何の関係もありません。
    • good
    • 0

>> bsearchのソースのデバッグのための情報はないでしょうから。


> この「デバッグのための情報」というのはなんなのでしょう

生成された機械語と元ソースとの対応表みたいなもん。
それがないと一行ずつ実行とかブレークポイントとか変数ウォッチとか、できない。

gccなんかだと、実行モジュールに埋め込むんだけど、VCは別ファイルなのです。

この回答への補足

ということは
つまりbsearch関数のソースはあるけど
第5引数はあんたが書いて用意したものだから
そこは知らないよ

と言われた、のでしょうか
それでブレークポイントを付けてステップインすると
エラーが出る

補足日時:2014/03/19 15:25
    • good
    • 0
この回答へのお礼

第5引数じゃなくてbsearch関数のソースがないって言ってるんですね。
もう少し勉強します。。

お礼日時:2014/03/23 19:51

> bsearch呼び出す前からステップ実行しててbsearchの処理の中に入ってってるだけじゃないかなぁ。



あ、そゆことか。
bsearchのソースだったら <VisualStudio-install-dir>\VC\crt\src にあるはず。
    • good
    • 0
この回答へのお礼

あ、それで\VC\srcの中のdllファイルを指定すればデバッグ可能になるのですね
この辺は2013になっても自動では認識してもらえないということですか。

それとも今からCは流行らないのかな・・・

お礼日時:2014/03/18 21:26

> 定義で int *int_cmp(const int *a, const int *b)


> とint_cmpの前に*は要らないのでしょうか。。

そんなことしたら int* を返す関数になっちゃうじゃないですか。

> ただ第5引数にint_cmpと書けばint_cmp関数の先頭アドレスが参照されることになってるんでしょうか。

です。厳密には &int_cmp ですけど、どっちでもOK。

> msvcr120d.i386.pdbが見つからない~

ごめんなさい、そんな現象に出くわしたことがないのでわからんです。
    • good
    • 0
この回答へのお礼

ありがとうございます。断定して頂けるのが助かります。

厳密には&int_cmpなんですね

この辺のあいまいさはCの醍醐味とも言えるかもしれませんね

お礼日時:2014/03/18 21:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!