任意の文字列より指定文字の検索を行いたいと思っています。
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 ) の型で
定義されています。
どなたか教えて頂けないでしょうか。よろしくお願い致します。
C++でコンパイルすると型のチェックが厳しくなってるので
そのようなエラーがでます。(.cならばおそらく出ないと思う)
キャストしてあげましょう。
memchr( static_cast< const void* >( string ), static_cast< int >( ch ), sizeof( string ) );
ついでにstrchrも調べられては。
chはint型でしたね。chのキャストは要りません。
# ハンガリアンになれてしまってるのでついchar型だと。。。orz
Blueさん。御回答ありがとうございます。
memchr( static_cast< const void* >( string ), ch, sizeof( string ) );
では同様のコンパイルエラーが出たのですが、
static_cast< char * >(( string, ch, sizeof( string ))) ;
で回避することができました。
すいません。memchrが抜けていました。正しくは
static_cast< char * >( memchr( string, ch, sizeof( string ) ));
です。
結果を代入していたのでしたね。見てなかった。orz
でも
pdest = static_cast< char* >( memchr( static_cast< const char* >( string ), ch, sizeof( string ) ) );
したほうがいいと思う。
あぅ。。。
> 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さん。丁寧なご解説ありがとうございます。
前回のソートに関してについても重ねて御礼申し上げます。
引数と戻り値のキャストについては上の説明で理解致しました。
全てのポインタは暗黙で void* に変換できることが保証されています。
そして、const へのキャストも暗黙で行われます。
つまり、char* -> void* -> const void*
# 先に const になってもいいですが.
でも、void* -> char* のキャストは常に正しいとは限らず、
正しいかどうかをコンパイラは判断できないので、
暗黙で変換できず C++ ではエラーになります。
# char -> int も暗黙で変換できますね。
ツイート | ![]() |