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


ひで  2005-02-21 10:46:06  No: 56490  IP: 192.*.*.*

お世話になります。
環境:
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 12:27:20  No: 56491  IP: 192.*.*.*

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

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

}

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

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

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

編集 削除
ひで  2005-02-21 12:50:17  No: 56492  IP: 192.*.*.*

申し訳ありません。
エラーとしてマネージクラス内で宣言された配列に対して、__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 02:36:24  No: 56493  IP: 192.*.*.*

> 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 を使って、コードページローカルなバイト配列に落とすことは出来ます。
そこまでする問題なのか、と思いますが。

編集 削除