クラスに配列を使用するには?


ひで  2005-02-21 19:46:06  No: 56490

お世話になります。
環境:
OS-XP
.NET FrameWork 1.1
VC++

Aクラスに次のように変数を定義しています。
public __gc class A
{
    private:
        String *s1;
        String *s2;
        unsigned char *c1;

}
c1の変数を32byteを使用するとしてc1[32]としたいのですが、unsigned char c1[32]とするとコンパイルエラーとなってしまいます。なんとか32byte
の領域を確保することはできないでしょうか。
どうか宜しくお願いいたします。


KING・王  2005-02-21 21:27:20  No: 56491

>c1の変数を32byteを使用するとしてc1[32]としたいのですが、unsigned char c1[32]とするとコンパイルエラーとなってしまいます。

public __gc class A
{
    private:
        String *s1;
        String *s2;
        unsigned char c1[32];<=ここを変えました

}

上記のように変更するとコンパイルエラーがでるのですか?

どんなコンパイルエラーがでるのですか?

情報不足で、ひで さんが提示されている条件だけではエラーがでないと思うのですが。


ひで  2005-02-21 21:50:17  No: 56492

申し訳ありません。
エラーとしてマネージクラス内で宣言された配列に対して、__gcまたは、__nogcを明示的に指定しなければなりません。というコンパイルエラーがでてしまいます。

現在
public __gc class A
{
    private:
        String *s1;
        String *s2;
        unsigned char c1  __gc [];←ここ
}
上記のように変更し、コンストラクタで

c1 = new char __gc [32];

としています。これでエラーはでなくなったのですが、
A::A(char cLid __gc[])
{
    this->cLid = cLid;
}
をmain関数から、
char c2[32];(c2には00000000000000000000000000000012と入っています。)
A::A( c2 );

に呼ぶと、char [32] から char __gc[]に変換できません。__gc 配列と Object * または Array * 間でのみ変換できます。というエラーが発生してしまいます。引数の渡し方としてどのように渡せばよいのでしょうか。


シャノン  2005-03-03 11:36:24  No: 56493

> char [32] から char __gc[]に変換できません。__gc 配列と Object * または Array * 間でのみ変換できます。

というエラーの通り、直接的な変換方法はありません。
char[] は、単なる char の集まりに過ぎませんが、char __gc[] は、.NET Framework の Array クラスに相当するオブジェクトです。

全てをマネージコードで書いてしまうというのが、一番簡単な方法だと思います。
つまり、

> char c2[32];(c2には00000000000000000000000000000012と入っています。)

これを __gc つきで宣言してしまう。

どうしても、ネイティブの char[] から char __gc[] に変換したいなら…どうするんでしょうね?  いい方法が思いつきません。
間に String を介して、char[] → String → ToCharArray で…と思ったら、戻り値は wchar_t __gc[] ですね。これではダメでしょうか?
マネージコードでは、文字はすべて Unicode なので、char[] の需要が、そもそもそんなにないのではないでしょうか。
どうしても、と言うのであれば、char[] を String にしてから、Encoding を使って、コードページローカルなバイト配列に落とすことは出来ます。
そこまでする問題なのか、と思いますが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加