以下のソースで例外が投入されるのですが。
//初期化
string str = static_cast<char>(0);
...
//問題箇所
if(*(str.c_str())){
...
//ここで例外投入
}
これを以下のようにして試しましたが、結果は同じ。
//問題箇所
if(!(*(str.c_str()))){
...
//ここで例外投入
}
ちなみに以下のソースでは例外は発生しない。
//問題箇所
if(*(str.c_str())){
/* ... */
//ここで例外投入
}
!演算子に関わらずif文が実行されているようですが、どういうことでしょう?
ポインタの用法が間違ってますか?
或いはstringの用法が間違ってるのでしょうか?
それから、0をchar型にキャストしたものは偽になると思ってますが、これは合ってますか?
条件式に関して
Re:条件式に関して
説明不足でしたが、if文の中の処理は、strの値が偽なら例外が投入されます。
以下のソースコードでは普通に動作しました。
//問題箇所
//if(*str.c_str){
無関係な処理
//...
//ここで例外投入
//}
このコードでは例外が発生しました。
//問題箇所
if(*str.c_str){
無関係な処理
//...
//ここで例外投入
}
条件式を戻り値が偽の別の関数に置き換えてみても例外が投入されます。
条件を定数(false)にしたら例外は投入されません。
例外が投入されるのは以下の条件だと推察します。
・条件が定数でなくて、条件と処理が共にコメントアウトされていない場合
・if文の中の処理が例外を投入(これは意図された処理ですが)
どういうことですかねぇ?
ここまで考えたところで意味不明なんですが。
以下のソースコードでは普通に動作しました。
//問題箇所
//if(*str.c_str){
無関係な処理
//...
//ここで例外投入
//}
このコードでは例外が発生しました。
//問題箇所
if(*str.c_str){
無関係な処理
//...
//ここで例外投入
}
条件式を戻り値が偽の別の関数に置き換えてみても例外が投入されます。
条件を定数(false)にしたら例外は投入されません。
例外が投入されるのは以下の条件だと推察します。
・条件が定数でなくて、条件と処理が共にコメントアウトされていない場合
・if文の中の処理が例外を投入(これは意図された処理ですが)
どういうことですかねぇ?
ここまで考えたところで意味不明なんですが。
Re:条件式に関して
環境がわからないですし、string型が std::stringのことなのか
それとも何か自作・多作の型なのかわかりませんが、
とりあえず std::stringだと仮定します。
その謎の 0による stringクラスの初期化を止めて下さい。
それでどうなりますか?
それとも何か自作・多作の型なのかわかりませんが、
とりあえず std::stringだと仮定します。
その謎の 0による stringクラスの初期化を止めて下さい。
それでどうなりますか?
Re:条件式に関して
string が std:string の意味であるなら...
> string str = static_cast<char>(0);
は、
string str(string(NULL));
の意味です。
結果的に未定義の動作を引き起こしています。
> string str = static_cast<char>(0);
は、
string str(string(NULL));
の意味です。
結果的に未定義の動作を引き起こしています。
Re:条件式に関して
std::stringです。
そうですね。
0での初期化はミステイクでした。
等式や不等式演算子に慣れないのでそうしましたが、
よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。
ちょっと試してみます。
そうですね。
0での初期化はミステイクでした。
等式や不等式演算子に慣れないのでそうしましたが、
よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。
ちょっと試してみます。
Re:条件式に関して
残念ながら解決できず。
条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
何故か異常終了するのですが。
環境はBCCで、WIN32APIを使用しています。
条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
何故か異常終了するのですが。
環境はBCCで、WIN32APIを使用しています。
Re:条件式に関して
> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。
empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?
> 条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
変えたプログラムを補足していただかなければ、何ともいえません。
empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?
> 条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
変えたプログラムを補足していただかなければ、何ともいえません。
Re:条件式に関して
>> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。
>empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?
言葉足らず。
空で初期化しておいて、ということです。
いろいろとやってたら解決しました。
Justyさん、たかぎさん、ありがとうございました。
>empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?
言葉足らず。
空で初期化しておいて、ということです。
いろいろとやってたら解決しました。
Justyさん、たかぎさん、ありがとうございました。