Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

初心者です。qsort()をうまく動 かせません。ヒントを与えてください。

566 views
Skip to first unread message

Tsuneo Mori

unread,
Mar 10, 1999, 3:00:00 AM3/10/99
to
C言語を勉強しているものです。頭をなやませている問題があるので
なにかよいヒントをお教え願えないでしょうか。

問題)qsort関数の使い方。
問題点)練習書どおりに以下のプログラムをうちこんでみたのですが、コンパイル
すると、passing argument 4 of ‘qsort’ from incompatible pointer type
という警告メッセージがでてしまいます。パラメータの設定のしかたに
問題があるのでしょうか?よろしくお願いいたします。
なお、コンパイラはgccをつかっています。

プログラム)クイックソートのプログラムです。

#include “stdio.h”
#include “stdlib”

int comp( int *i, int *j );

void main( void )
{
int sort [100] , i;

for ( i=0 ; i<100 ; i++ )
sort[ i] = rand ( );
qsort ( sort, 100, sizeof (int), comp );

for ( i=0 ; i<100; i++ )
printf(“%d\n”, sort[i] );
}

comp ( int *i, int *j )
{
return *i - *j;
}

以上です。

UEBAYASHI Masao

unread,
Mar 11, 1999, 3:00:00 AM3/11/99
to
"Tsuneo Mori" <jh0...@ka2.so-net.or.jp> writes:

> C言語を勉強しているものです。頭をなやませている問題があるので
> なにかよいヒントをお教え願えないでしょうか。

同じく勉強中の人です.

qsortをmanすると

void
qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))

とありますので,これにならって

> qsort ( sort, 100, sizeof (int), comp );

qsort(sort, 100, sizeof(int), (int (* )()) comp);
^^^^^^^^^^^^

という風にキャストしてみると警告がなくなりました(教科書のキャ
ストのところ参照).

ところで,便乗質問ですが,

> すると、passing argument 4 of ‘qsort’ from incompatible pointer type

このpassの主語って何なんでしょうか?fromってのも今一分からな
いかも….

--
``Earth provides enough for every man's need,
but not every man's greed.'' --- Ghandi

うえ林

Yoshio Kiya

unread,
Mar 11, 1999, 3:00:00 AM3/11/99
to
 Tsuneo Moriさん、こんにちは、木屋と申します。

Tsuneo Mori wrote in <7c5t4n$84b$1...@news01ca.so-net.ne.jp>


> int comp( int *i, int *j );

int comp( const void *i, const void *j );

> comp ( int *i, int *j )
> {
> return *i - *j;
> }

int comp ( const void *i, const void *j )
{
return *(int*)i - *(int*)j;
}

 なんて直し方もあります。

あと、コンパイラの最適化を前提にするなら、

int comp ( const void *i, const void *j )
{
int *i2 = (int *)i;
int *j2 = (int *)j;

return *i2 - *j2;
}

# 私はこちらの方が好みです。

 構造体などを引数にした場合などは、こちらの方が見やすいし間
違いが少なくて良いと思います。

 キャストは、せっかくの型チェック機能を殺してしまうことにな
りますので、なるべく少ないほうが良いですから。

=== Nihon application Co.,LTD. 木屋 善夫 ki...@nac.co.jp ===

Kentaro ONIZUKA

unread,
Mar 11, 1999, 3:00:00 AM3/11/99
to
In article <7c5t4n$84b$1...@news01ca.so-net.ne.jp> "Tsuneo Mori" <jh0...@ka2.so-net.or.jp> writes:

>問題)qsort関数の使い方。
>問題点)練習書どおりに以下のプログラムをうちこんでみたのですが、コンパイル

>すると、passing argument 4 of ‘qsort’ from incompatible pointer type

>という警告メッセージがでてしまいます。パラメータの設定のしかたに
>問題があるのでしょうか?よろしくお願いいたします。

はい。問題があります。comp(int*,int*) ではなくて、comp(int,int) でいい
はず。
#そうじゃないと、結果が変になるはず。

本当は、

int sort*[100];
int i;
for(i=0;i<100;++i) { sort[i]=malloc(sizeof(int)); *(sort[i])=rand();}

で、そういう場合は、comp(int*,int*) ではないかなと。

鬼塚


Hiroshi Tezuka

unread,
Mar 11, 1999, 3:00:00 AM3/11/99
to
oni...@mpapia.trc.rwcp.or.jp (Kentaro ONIZUKA) writes:

鬼塚さーん、うそ教えちゃだめですよ。
#試してないでしょ。

手塚@新情報

Iwao Watanabe

unread,
Mar 12, 1999, 3:00:00 AM3/12/99
to
Tsuneo Mori wrote:

> 問題)qsort関数の使い方。
> 問題点)練習書どおりに以下のプログラムをうちこんでみたのですが、コンパイル
> すると、passing argument 4 of ‘qsort’ from incompatible pointer type
> という警告メッセージがでてしまいます。パラメータの設定のしかたに
> 問題があるのでしょうか?

(snip)

> int comp( int *i, int *j );

(snip)

> qsort ( sort, 100, sizeof (int), comp );

(snip)

エラーメッセ時の意味するところは、
「qsortに渡す4番目の引数について、ポインターの型が合っていない」
ですから、compの定義(この場合は宣言も含む)の仕方がまずいということです。

例えば以下のように記述すればよいです。

int comp(const void *a,const void *b)
{
const int *a1 = a,*b1 = b;
return *a1 - *b1;
}


Tsuneo Mori

unread,
Mar 14, 1999, 3:00:00 AM3/14/99
to
皆さん、いろいろどうもご指導いただきありがとうございました。
さっそく試してみたいと思います。当方、出張のためお礼が
遅れてしまったことをお詫びいたします。今後ともご指導
よろしくお願いいたします。

vzy0...@ha.bekkoame.ne.jp

unread,
Mar 24, 1999, 3:00:00 AM3/24/99
to

Iwao Watanabe wrote:
>
> int comp(const void *a,const void *b)
> {
> const int *a1 = a,*b1 = b;
> return *a1 - *b1;
> }

int が 16bit の場合にはこれではまずいかも。

*a1 == -40000
*b1 == 40000

return *a1 - *b1; // -80000 -> +14468

で a1 の方が大きいことになってしまう。

文字列の比較にしても、8bit目がつかわれていない時にしか
使えませんね。

if (*a1 < *b1) return -1;
if (*a1 > *b1) return 1;
return 0;

でないとまずいでしょうね。

vzy0...@ha.bekkoame.ne.jp

unread,
Mar 24, 1999, 3:00:00 AM3/24/99
to

vzy0...@ha.bekkoame.ne.jp wrote:
>
> int が 16bit の場合にはこれではまずいかも。
>
> *a1 == -40000
> *b1 == 40000
>
> return *a1 - *b1; // -80000 -> +14468
>
> で a1 の方が大きいことになってしまう。

嘘を書いてしまいました。
全てが、signed intならば、例え数値が意味を持たなくはなっても符号には
問題が無い環境がほとんどですね。

YOSIDA Takayuki

unread,
Mar 25, 1999, 3:00:00 AM3/25/99
to
吉田@parkcityです。

vzy0...@ha.bekkoame.ne.jp wrote:

> 全てが、signed intならば、例え数値が意味を持たなくはなっても
> 符号には問題が無い環境がほとんどですね。

16bitかどうかに関係なくやはりまずい気がします。

例えばintが32bitで
*a1 == 0x90000000 < 0
*b1 == 0x70000000 > 0
の場合、
*a1 - *b1 == 0x2000000 > 0
になってしまいますよね?

この方法が使えるのは比較したい型が返却型より長い場合だけでないかな。
--


0 new messages