ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12043  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

String コンストラクタ を読んでいて思ったこと。

わかりにくい!

例えばこれ! String コンストラクタ (Char*)

Char * って System::Char なので Unicode だろうから、WCHAR すなわち wchar_t というところまではすぐにわかるけどね。System::Char の pointer って正直何よ? って感じが。。。

とはいえ、C++ の宣言は下記になっているから許せるけど。

[CLSCompliantAttribute(false)] public: String( wchar_t* value )

でも、最初に探すとき wchar_t * (WCHAR *, LPWSTR) で調べると思うんですよね。C++/CLI 以外でこんな constructor まず使わないと思うので、wchar_t * でいいんじゃないかと。

もっとわかりにくいのは String コンストラクタ (SByte*) ! 何これ! System::SByte 構造体 なんて普通知らんじゃないかな?

で、参照すると IEquatable 。 ふむふむ、signed char と互換性があるのね。って、ここまで references 掘り下げないとわからないのかよ!

String コンストラクタ (signed char *) にしてくれないかなぁ~と。

ここまでやってようやくわかったんだけど、要するに System::String constructor 使って Unicode だろうと MBCS だろうと C の文字列から System::String に変換できるのね。

char string1[] = "あいうえお";
wchar_t string2[] = L"あいうえお";
System::String ^ clrString1 = gcnew System::String(string1);
System::String ^ clrString2 = gcnew System::String(string2);
System::Console::Write("MBCS:\t{0:s}\nUnicode:\t{1:s}\n", clrString1, clrString2);

上記ができる説明をしたつもりだったけど、実際は全然違うみたい。

signed char string1[] = "あいうえお";

にすると compile eroor になるし。。。正確な情報どなたか教えてください。

投稿日時 : 2009年6月14日 15:40

コメント

# re: System::String constructor 2009/06/14 17:14 NyaRuRu
すみません,何が分からないのかが結局よく分かりませんでした.
こんなコードならとりあえず動きますが……

using System;
using System.Text;

static class Program
{
  static void Main(string[] args)
  {
    unsafe
    {
      byte[] string1 = Encoding.GetEncoding("Shift_JIS").GetBytes("あいうえお");
      char[] string2 = "あいうえお".ToCharArray();

      fixed(byte* ptr1 = string1)
      fixed(char* ptr2 = string2)
      {
        string clrString1 = new string((sbyte*)ptr1);
        string clrString2 = new string(ptr2);

        Console.WriteLine("MBCS:\t{0:s}\nUnicode:\t{1:s}\n", clrString1, clrString2);
      }
    }
  }
}


# re: System::String constructor 2009/06/14 17:30 NyaRuRuRu
あー,MSDN Libraryの見出しが分かりにくいという話でしょうか?
ドキュメントの見出しが「String コンストラクタ (SByte*)」とあるけど,そいつはC++/CLIを使っている人に激しく分かりにくいから,見出しを「String コンストラクタ (signed char *)」にでも変えてくれと.
そういうことでしょうか?

# re: System::String constructor 2009/06/14 18:51 ちゃっぴ
> あー,MSDN Libraryの見出しが分かりにくいという話でしょうか?

問題は 2 つありますが、1 点目はそういうことです。

この constructor って unmanaged programming やる時しかおそらく使わないでしょうから、unmanaged やっている人になじみの深い表記にしてもらえるとありがたいかな~と。

もっとも、正確な定義を書くべきだという意見もわかりますから、両方併記するといいんじゃないかと。

もう 1 点の問題は signed char * となっているのに、signed char [] にすると compile error になることです。

signed char string1[] = "あいうえお";
System::String ^ clrString1 = gcnew System::String(string1);

error C2664: 'System::String::String(const wchar_t *)' : 1 番目の引数を 'signed char [11]' から 'const wchar_t *' に変換できません。(新しい機能 ; ヘルプを参照)

char string1[] = "あいうえお";
System::String ^ clrString1 = gcnew System::String(string1);

は普通に compile 通ります。
環境は VS2008 Professional Edition SP1 です。

# re: System::String constructor 2009/06/14 22:41 ちゃっぴ
http://blogs.wankuma.com/tyappi/archive/2009/06/14/175237.aspx

上記の実験結果から推測するに System::SByte は signed char ではなく、char と相互運用性があるんじゃないかと思います。違ってるかな~?

# re: System::String constructor 2009/06/14 23:48 ちゃっぴ
MSDN reference には feedback 挙げときました。

# re: System::String constructor 2009/06/15 9:25 NyaRuRu
>この constructor って unmanaged programming やる時しかおそらく使わないでしょうから、unmanaged やっている人になじみの深い表記にしてもらえるとありがたいかな~と。

そんな理由で見出しの内容を変えられると困るような.
個人的には反対です.

>もっとも、正確な定義を書くべきだという意見もわかりますから、両方併記するといいんじゃないかと。

いまでも言語ごとのシグネチャのところには書かれているので,別に今のままでいいんじゃないでしょうかね.
ただまあ char の部分は確かに,
[CLSCompliantAttribute(false)]
public:
String(
char* value
)
となるべきかもしれませんが.

> もう 1 点の問題は signed char * となっているのに、signed char [] にすると compile error になることです。

それは他の方も書かれているようにC++の規格がそうなっているという話かと.C++/CLI関係無しに,そもそもこれが通らないでしょう.
signed char* string2 = "あいうえお";
unsigned char* string3 = "あいうえお";


# re: System::String constructor 2009/06/15 9:48 ちゃっぴ
下記は /J の有無に関わらず、compile が通ります。

char string1[] = "あいうえお";
printf("%d\n", string1[0]);
System::String ^ clrString1 = gcnew System::String(string1);

結果は。。。

/J 無し: -126
/J 有り: 130

そ、そなのね。。。

# re: System::String constructor 2009/06/15 12:39 ちゃっぴ
> そんな理由で見出しの内容を変えられると困るような.

反対ですか。。。

> いまでも言語ごとのシグネチャのところには書かれているので,別に今のままでいいんじゃないでしょうかね.

そこまで辿らなくてもわかると助かるんですがね。
って、intellisence 使ってみると。。。

String (const wchar_t *value)
String (const char *value)

ちゃんと出てくるじゃないか。せめてここに記述するというのはできないですかね?

String コンストラクタ
http://msdn.microsoft.com/ja-jp/library/system.string.string.aspx

> それは他の方も書かれているようにC++の規格がそうなっているという話かと.

ですね。納得いかないけど。。。
Pre-compile 時に何とかすれば相互運用性保てるでしょうに。。。

# re: System::String constructor 2009/06/15 13:40 egtra
なんかSystem::Stringが特別扱いされているように思います。

using namespace System;

ref class MyString {
public:
MyString(SByte*) {}
MyString(Char*) {}
};

int main() {
char c[5];
signed char sc[5];
unsigned char uc[5];
SByte sb[5];

gcnew MyString(c); // エラー char[5]からsigned char*に変換できない
gcnew MyString(sc);
gcnew MyString(uc); // エラー unsigned char[5]からsigned char*に変換できない
gcnew MyString(sb);

gcnew String(c);
gcnew String(sc); // signed char[5]からconst wchar_t*に変換できない
gcnew String(uc); // unsigned char[5]からconst wchar_t*に変換できない
gcnew String(sb); // signed char[5]からconst wchar_t*に変換できない
}

# System::String constructor まとめ 2009/06/21 0:03 ちゃっぴの監禁部屋
System::String constructor まとめ

# Microsoft(R) C/C++ Optimizing Compiler が落ちる 2009/06/21 0:21 ちゃっぴの監禁部屋
Microsoft(R) C/C++ Optimizing Compiler が落ちる

# jianbin0301 2018/03/01 14:36 165464@qq.com
http://www.coachfactoryoutlet-clearance.us.com
http://www.swarovskicrystalco.org.uk
http://www.montblancpenssale.us.com
http://www.fredperrypolo-shirts.com
http://www.rayban--sunglasses.co.uk
http://www.toryburchoutletofficials.us.com
http://www.christianlouboutins.org.uk
http://www.mulberrybagsuk.co.uk
http://www.raybansunglassesonsales.us.com
http://www.poloralphlaurenoutlet-online.us.com
http://www.uggoutlet.ca
http://www.reebokoutletstores.us.com
http://www.airhuaracheuk.org.uk
http://www.outlettruereligion.in.net
http://www.coachfactoryoutletstore.com.co
http://www.mulberryhandbagss.org.uk
http://www.ralphlauren-polo.us.org
http://www.raybansunglasses2.us.com
http://www.nfljerseysfactorystore.us.com
http://www.raybansunglassesonlines.us.com
http://www.cheapsoccerjersey.net
http://www.longchamphandbagssale.co.uk
http://www.canadagooseoutletclearance.us.com
http://www.michaelkorsoutletfriday.us.com
http://www.oakleysunglasseswear.us.com
http://www.nikeoutlets.us.org
http://www.poloralphlaurendiscount.us.com
http://www.canadagooseoutletcom.us.com
http://www.coachoutletclearance.us.org
http://www.canadagooseoutletcoats.us.com
http://www.jordanshoesstore.us.com
http://www.christianlouboutin-shoes.me.uk
http://www.ralph-laurenpoloshirts.us.com
http://www.uggsoutletshop.us.com
http://www.coachoutletclearanceonline.us.com
http://www.michaelkorsoutletme.us.com
http://www.raybanssunglassesoutlets.us.com
http://www.oakleysunglassesformens.us.com
http://www.coach-factoryoutlets.us.org
http://www.suprashoes.us.com
http://www.oakleysunglasseswholesaleus.us.com
http://www.fitflopsshoes.in.net
http://www.katespadeoutletsales.us.com
http://www.mcmoutletstore.us.org
http://www.michaelkorsoutletcoupons.us.com
http://www.oakleysunglassessites.us.com
http://www.jordanshoesfactory.us.com
http://www.nikerosheone.us
http://www.coachoutletcoupons.us.com
http://www.canadagooseoutletsalestore.us.com
http://www.uggsoutletco.us.com
http://www.yeezyboost350sale.us.com
http://www.clevelandcavaliers.us.com
http://www.poloralphlaurenofficial.us.com
http://www.raybansunglassesforwomens.us.com
http://www.coachoutletstore.com.co
http://www.adidasnmdad.us.com
http://www.katespadeoutletofficial.us.org
http://www.uggoutletstoresofficial.us.com
http://www.raybanssunglassessale.us.com
http://www.canadagoosejacketsusa.us.com
http://www.pandora-charmssaleclearance.org.uk
http://www.michaelkors.eu.com
http://www.raybansunglassesoutlets.com.co
http://www.swarovski-outlets.us.comhttp://www.kobe9elites.us.com
http://www.nbajerseysstore.us.com
http://www.michaelkors.de.com
http://www.ferragamoshoes.org.uk
http://www.lacostepoloshirts.us.com
http://www.airforce1.us.com
http://www.canadagoose-jackets.org.uk
http://www.canadagoosejackets.me.uk
http://www.michaelkorsoutletclearance-online.us.com
http://www.fitflopssale.in.net
http://www.canadagoosejacketscg.ca
http://www.jordanshoesshop.us.com
http://www.pandoracharmss.us.com
http://www.pandoraoutlet-store.us.com
http://www.cheapjerseyswholesale.org
http://www.newbalanceshoes.in.net

Post Feedback

タイトル
名前
Url:
コメント