memchr 関数について

解決


ZUKI-MU  2005-06-29 03:38:38  No: 58087

任意の文字列より指定文字の検索を行いたいと思っています。
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-29 03:55:23  No: 58088

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

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

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


Blue  2005-06-29 03:56:49  No: 58089

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

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


ZUKI-MU  2005-06-29 04:09:51  No: 58090

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


ZUKI-MU  2005-06-29 04:11:27  No: 58091

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


Blue  2005-06-29 04:14:45  No: 58092

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

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

したほうがいいと思う。


Blue  2005-06-29 04:16:12  No: 58093

あぅ。。。
> 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-29 04:18:48  No: 58094

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

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

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


ZUKI-MU  2005-06-29 04:23:39  No: 58095

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


Ban  2005-06-29 05:26:37  No: 58096

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加