memchr 関数について

解決


ZUKI-MU  2005-06-28 18:38:38  No: 58087  IP: 192.*.*.*

任意の文字列より指定文字の検索を行いたいと思っています。
memchr関数を使用して以下のテストソースを作成しました。
環境はVC++.NETです。

#include <memory.h>

int  ch = 'r';
char string[] = "I was listening to the redio yesterday.";

void main( void )
{
   char *pdest;
   
   pdest = memchr( string, ch, sizeof( string ) );
}

コンパイルすると void * から char * に変換できません。
というエラーが発生します。
memchr関数は void *memchr( const void *, int, size_t ) の型で
定義されています。
どなたか教えて頂けないでしょうか。よろしくお願い致します。

編集 削除
Blue  2005-06-28 18:55:23  No: 58088  IP: 192.*.*.*

C++でコンパイルすると型のチェックが厳しくなってるので
そのようなエラーがでます。(.cならばおそらく出ないと思う)

キャストしてあげましょう。
memchr( static_cast< const void* >( string ), static_cast< int >( ch ), sizeof( string ) );

ついでにstrchrも調べられては。

編集 削除
Blue  2005-06-28 18:56:49  No: 58089  IP: 192.*.*.*

chはint型でしたね。chのキャストは要りません。

# ハンガリアンになれてしまってるのでついchar型だと。。。orz

編集 削除
ZUKI-MU  2005-06-28 19:09:51  No: 58090  IP: 192.*.*.*

Blueさん。御回答ありがとうございます。
memchr( static_cast< const void* >( string ), ch, sizeof( string ) );
では同様のコンパイルエラーが出たのですが、
static_cast< char * >(( string, ch, sizeof( string ))) ;
で回避することができました。

編集 削除
ZUKI-MU  2005-06-28 19:11:27  No: 58091  IP: 192.*.*.*

すいません。memchrが抜けていました。正しくは
static_cast< char * >( memchr( string, ch, sizeof( string ) ));
です。

編集 削除
Blue  2005-06-28 19:14:45  No: 58092  IP: 192.*.*.*

結果を代入していたのでしたね。見てなかった。orz

でも 
pdest = static_cast< char* >( memchr( static_cast< const char* >( string ), ch, sizeof( string ) ) );

したほうがいいと思う。

編集 削除
Blue  2005-06-28 19:16:12  No: 58093  IP: 192.*.*.*

あぅ。。。
> pdest = static_cast< char* >( memchr( static_cast< const char* >( string ), ch, sizeof( string ) ) );
pdest = static_cast< char* >( memchr( static_cast< const void* >( string ), ch, sizeof( string ) ) );

λ....

編集 削除
Blue  2005-06-28 19:18:48  No: 58094  IP: 192.*.*.*

関数等の引き数の代入時には暗黙的にキャストがかかるから明示的にしなくてもいいのかな。

戻り値の場合は決まった型でしか受け取れないからキャストしてあげないといけない。

と言う解釈でいいのかな。。。
# またしてもキャストで悩む(汗)

編集 削除
ZUKI-MU  2005-06-28 19:23:39  No: 58095  IP: 192.*.*.*

Blueさん。丁寧なご解説ありがとうございます。
前回のソートに関してについても重ねて御礼申し上げます。
引数と戻り値のキャストについては上の説明で理解致しました。

編集 削除
Ban  2005-06-28 20:26:37  No: 58096  IP: 192.*.*.*

全てのポインタは暗黙で void* に変換できることが保証されています。
そして、const へのキャストも暗黙で行われます。
つまり、char* -> void* -> const void*
# 先に const になってもいいですが.

でも、void* -> char* のキャストは常に正しいとは限らず、
正しいかどうかをコンパイラは判断できないので、
暗黙で変換できず C++ ではエラーになります。

# char -> int も暗黙で変換できますね。

編集 削除