質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

静的定数System::Char^型定数をStringクラスSplit関数で使用する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,014

score 62

前提

C++/CLIのライブラリ開発を行っています。
System::String型変数の値「XXX.YYY」を'.'で分割したいので、変数のSplit関数を引数にSystem::Char^型定数を入れる処理を作りました。

例)

hファイル
namespace act{
    ref class main{
        void output();
    };

    ref class constant{
    public:
        static const System::Char^ SEPARATORCHAR_DOT = gcnew System::Char('.');
    };
}

cppファイル
namespace act{
    void main::output(){
        System::String^ str = gcnew System::String^("XXX.YYY)";
        cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT)));
    }
}

質問

前提に記載した方法では、Split関数処理部分でTypeinitializationExceptionが発生してしまいます。
Split関数内の処理を分けてみた結果としては、const_cast関数で発生しているエラーのようです。
コンパイル時点では特にエラーは無いのですが、どこに誤りがあり、正常動作をしないのでしょうか?

試してみたこと

①char*型変数に変更

hファイル
namespace act{
    ref class main{
        void output();
    };

    ref class constant{
    public:
        static const char* SEPARATORCHAR_DOT = ".";
    };
}

cppファイル
namespace act{
    void main::output(){
        System::String^ str = gcnew System::String^("XXX.YYY)";
        cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<char*>(constant::SEPARATORCHAR_DOT)));
    }
}


⇒C4800の警告がでました。
メッセージ:'char *': ブール値を 'true' または 'false' に強制的に設定します (警告の処理)

開発環境

Visual Studio 2015 Professional

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • JanTh1989

    2019/05/16 16:37

    早速の返答ありがとうございます。
    ・Split関数でエラーが発生しているという文面の追加。
    ・C4800が質問意図ではなく、TypeinitializationException回避の方法が質問意図になるため、試してみたことは見出し分け
    の2点で文法修正をしました。
    あとは念のため、開発環境のVSバージョンも記載しました。

    キャンセル

  • JanTh1989

    2019/05/16 16:41

    また、記載頂いている「>」の演算子という話ですが、自分としては演算子認識ではありませんでした。
    const_cast<Char^>の<>はあくまでconstを外したあとの型指定するための<>であって、特に演算などはしていないつもりです。

    キャンセル

  • stdio

    2019/05/16 17:00

    あ、なんか勘違いしてましたわ。
    普通に区切り文字が1つの場合は「str->Split('.');」で済むからね。
    一度const char*をstd::stringにしてから、System::Stringにする方法なら思いつくけど、その辺は私もやったことありませんので少し分かりません。
    https://takachan.hatenablog.com/entry/2017/11/29/200234

    キャンセル

回答 1

checkベストアンサー

0

上の方はコピペミスと思しきものを直せば普通にできると思うのですが、、、最小構成(PJ新規作成)で試しても同じでしょうか?
下の方はToCharの引数がchar*になっているからです。charにしてください。

namespace act {
    ref class main {
    public:
        void output();
    };

    ref class constant {
    public:
        static const System::Char^ SEPARATORCHAR_DOT = gcnew System::Char('.');
        static const char* SEPARATORCHAR_DOT_NATIVE = ".";
    };
}

namespace act {
    void main::output() {
        System::String^ str = gcnew System::String("XXX.YYY");
        auto resManaged = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT)));
        auto resNative= str->Split(System::Convert::ToChar(*constant::SEPARATORCHAR_DOT_NATIVE));
        Console::WriteLine(resManaged[0] + ", " + resManaged[1]);
        Console::WriteLine(resNative[0] + ", " + resNative[1]);
    }
}


↑の実行結果

XXX, YYY
XXX, YYY

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/16 18:27

    ご回答ありがとうございます。

    CLRのコンソールプロジェクトに頂いたコードをそのまま実行してみたところ、正常動作しました。

    その後、自分のプロジェクトで実行してみた結果としては、どちらでやってもTypeinitializationExceptionが発生してしまいました。

    実際のコードのクラスとを比較してみたところ、静的コンストラクタが入っているという差があったため、コメントアウトしてみた結果、正常動作しました。

    どうしてこういう結果になるのかはわかってはいませんが、constantクラスには、連想配列(Dictionary型)もメンバ変数にあり、初期化子ができない理由から、静的コンストラクタで値を入れることとしていたため、消すわけにもいかない状況となってしまい、再度頭を悩ませることとなりました。

    キャンセル

  • 2019/05/16 23:31

    ひとまず、質問の主目的となっているconst_castの書き方については解決ができましたので、この質問については締めるようにします。
    ご回答ありがとうございました。

    キャンセル

  • 2019/05/17 09:43

    static constant() { throw 0; }
    を追加したらTypeinitializationExceptionが発生しました。
    Exceptionの詳細、実装内容を提示できるならば、情報を得られるかもしれません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る