マネージコードのswitchについて – プログラミング – Home

マネージコードのswitchについて
 
通知
すべてクリア

[解決済] マネージコードのswitchについて


taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

こんにちは。お世話になります。WindowsXP VC++.NETのマネージコードで開発していま
す。

switch ステートメントでちょっとした問題が出たので質問させてください。

String* の型でswitchを使いたいのですが上手くいきません。もしかして不可能なんで
しょうか?

こんな感じです。

String* ss;
//途中省略

switch(ss)
{
case 'A':
return 0;
break;
case 'B':
return 1;
break;
default:
return 2;
break;
}

こうすると、「error C2450: switch 式の求める数値の型 'System::String __gc *' が
無効です」とでてしまいます。やはりString* はポインタなので違った書き方が要求さ
れるってことですかね?どなたかわかりますか?


引用未解決
トピックタグ
taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

すみません。ちょっと足りなかったです。これはint型を返す関数の中なので、returnが
使われています。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

ssはポインタ型なんですよね? で、各caseは文字定数なんですよね。全然型が違うのでダ
メです。

ssの中身を一旦char or int型の変数に入れて、それをswitch文に使うか、
if文でssの中身をいちいち照合するといいでしょう。

私だったら
struct
{
 char ch;
 int rc;
} *p, table[] = {
 { 'A', 0 },
 { 'B', 1 },
 { 0 , 2 }
};
みたいな構造体の配列を定義して、

int rc=2;
for( p=table; p->ch; p++ )
{
 if( ssの中身がp->chと等しい )
 {
  rc=p->rc;
  break;
 }
}
return rc;

ってすると思います。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

できません。 Managed C++ は C# ではありませんから。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 19年前
投稿: 59
 

ある一意の文字列からある値を取得するような時は
HashTableクラスを使うと便利です。

System::Collections::Hashtable* table;
table = __gc new System::Collections::Hashtable();

table->Add( SA, __box( 0 ) );
table->Add( SB, __box( 1 ) );

System::String* s = A;
if ( table->ContainsKey( s ) )
{
return *( dynamic_cast< __box int* >( table->Item[ s ] ) );
}
return 2;


返信引用
taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

みなさんありがとうございました。
とりあえず、Hashtable class を使ってうまくいきました。tibさんのやりかたもやっ
てみます。やはり考え方を変えるってのは大事ですね。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 19年前
投稿: 59
 

ちなみに、
> int型を返す関数
ということなので、何度も呼ぶたびに、Hashtableをつくるのは無駄が多すぎます。

__gc クラスにして、staticなメンバ変数にして使うと効率が良くなります。

例)
#using <mscorlib.dll>

using namespace System;
using namespace System::Collections;

__gc class TEST
{
private:
static Hashtable* tbl = new Hashtable();
static TEST()
{
tbl->Add( SA, __box( 1 ) );
tbl->Add( SB, __box( 2 ) );
}
public:
static int GetNumber( String* key )
{
if ( tbl->ContainsKey( key ) )
{
return *( static_cast< __box int* >( tbl->Item[ key ] ) );
}
return 0;
}
};

int main( void )
{
int n1 = TEST::GetNumber( SA );
int n2 = TEST::GetNumber( SB );
int n3 = TEST::GetNumber( SC );
Console::WriteLine( A={0},B={1},C={2},
__box( n1 ), __box( n2 ), __box( n3 ) );

return 0;
}

C++: マネージ拡張の仕様
19 静的クラス コンストラクタ
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vcmxspec/html/vcmanagedextensionsspec_19.asp


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました