お世話になります。
環境:
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
の領域を確保することはできないでしょうか。
どうか宜しくお願いいたします。
>c1の変数を32byteを使用するとしてc1[32]としたいのですが、unsigned char c1[32]とするとコンパイルエラーとなってしまいます。
public __gc class A
{
private:
String *s1;
String *s2;
unsigned char c1[32];<=ここを変えました
}
上記のように変更するとコンパイルエラーがでるのですか?
どんなコンパイルエラーがでるのですか?
情報不足で、ひで さんが提示されている条件だけではエラーがでないと思うのですが。
申し訳ありません。
エラーとしてマネージクラス内で宣言された配列に対して、__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 * 間でのみ変換できます。というエラーが発生してしまいます。引数の渡し方としてどのように渡せばよいのでしょうか。
> 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 を使って、コードページローカルなバイト配列に落とすことは出来ます。
そこまでする問題なのか、と思いますが。
ツイート | ![]() |