問題)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;
}
以上です。
> 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
うえ林
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 ===
>問題)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*) ではないかなと。
鬼塚
> 問題)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;
}
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;
でないとまずいでしょうね。
嘘を書いてしまいました。
全てが、signed intならば、例え数値が意味を持たなくはなっても符号には
問題が無い環境がほとんどですね。
vzy0...@ha.bekkoame.ne.jp wrote:
> 全てが、signed intならば、例え数値が意味を持たなくはなっても
> 符号には問題が無い環境がほとんどですね。
16bitかどうかに関係なくやはりまずい気がします。
例えばintが32bitで
*a1 == 0x90000000 < 0
*b1 == 0x70000000 > 0
の場合、
*a1 - *b1 == 0x2000000 > 0
になってしまいますよね?
この方法が使えるのは比較したい型が返却型より長い場合だけでないかな。
--