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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Q&A

解決済

1回答

1763閲覧

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

JanTh1989

総合スコア87

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

0グッド

0クリップ

投稿2019/05/16 05:57

編集2019/05/16 07:33

前提

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

例)

C++

1hファイル 2namespace act{ 3 ref class main{ 4 void output(); 5 }; 6 7 ref class constant{ 8 public: 9 static const System::Char^ SEPARATORCHAR_DOT = gcnew System::Char('.'); 10 }; 11} 12 13cppファイル 14namespace act{ 15 void main::output(){ 16 System::String^ str = gcnew System::String^("XXX.YYY)"; 17 cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT))); 18 } 19}

質問

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

試してみたこと

①char*型変数に変更

C++

1hファイル 2namespace act{ 3 ref class main{ 4 void output(); 5 }; 6 7 ref class constant{ 8 public: 9 static const char* SEPARATORCHAR_DOT = "."; 10 }; 11} 12 13cppファイル 14namespace act{ 15 void main::output(){ 16 System::String^ str = gcnew System::String^("XXX.YYY)"; 17 cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<char*>(constant::SEPARATORCHAR_DOT))); 18 } 19}

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

開発環境

Visual Studio 2015 Professional

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/05/16 07:25 編集

申し訳ありませんが、"その関数"が何を指しているのかをお教え願えないでしょうか。 関数についてはoutput関数で処理を行います。 例外発生箇所は、output関数内の str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT))); で発生しており、 そのうちの「const_cast<Char^>(constant::SEPARATORCHAR_DOT)」で 発生している旨を記載しているつもりです。 書き方、不足情報がありましたら、お教え下さい。 修正します。
stdio

2019/05/16 07:31

> System::String型変数の値「XXX.YYY」を'.'で分割したいので、変数のSplit関数を引数にSystem::Char^型定数を入れる処理を作りました。 ここの文の事だよー。 多分、私的には「cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT)));」でなんか「>」の演算子がエラーの原因だと睨んでいるよ。 もし貴方がここでシフト演算を行っているつもりなら演算子が違うよ。「>>」だよ。 https://www.javadrive.jp/cstart/ope/index7.html
JanTh1989

2019/05/16 07:37

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

2019/05/16 07:41

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

2019/05/16 08:00

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

回答1

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 08:06

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/05/16 09:27

ご回答ありがとうございます。 CLRのコンソールプロジェクトに頂いたコードをそのまま実行してみたところ、正常動作しました。 その後、自分のプロジェクトで実行してみた結果としては、どちらでやってもTypeinitializationExceptionが発生してしまいました。 実際のコードのクラスとを比較してみたところ、静的コンストラクタが入っているという差があったため、コメントアウトしてみた結果、正常動作しました。 どうしてこういう結果になるのかはわかってはいませんが、constantクラスには、連想配列(Dictionary型)もメンバ変数にあり、初期化子ができない理由から、静的コンストラクタで値を入れることとしていたため、消すわけにもいかない状況となってしまい、再度頭を悩ませることとなりました。
JanTh1989

2019/05/16 14:31

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

2019/05/17 00:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問