Re: managed c++ pinned pointer cast
- From: "Norman Diamond" <ndiamond@xxxxxxxxxxxxxxxx>
- Date: Thu, 29 Sep 2005 18:20:19 +0900
In reply to Tim, plain char is a different type from unsigned char. Pointer to plain char and pointer to unsigned char do not automatically convert to each other. You need a cast. The management disclaims all responsibility for this one.
Concerning Marcus Heege's report, if one line is commented out then the warning seems to have its "from" and "to" backwards. The cast is converting an rvalue FROM a pointer to pinned type TO a pointer to managed type. Is this a bug in a Dutch language version of Visual Studio, a bug in Mr. Heege's translation, or a bug in an English language version of Visual Studio?
"Marcus Heege" <NOSPAM@xxxxxxxxx> wrote in message news:uBQtr8LxFHA.916@xxxxxxxxxxxxxxxxxxxxxxx
I can't reproduce your problem. The following code compiles:
<code> #using <mscorlib.dll>
using namespace System;
int main() { Byte bytes __gc [] = __gc new Byte __gc [100]; Byte __pin* ppBytes = &bytes[0]; Byte* pBytes1 = ppBytes; Byte* pBytes2 = static_cast<Byte*>(ppBytes); //Byte* pBytes3 = (Byte*)ppBytes; } </code>
If I uncomment the last line, I get a warning:
test.cpp(11) : warning C4303: C-style cast from 'unsigned char __gc *' to 'unsigned char __pin *volatile ' is deprecated, use static_cast, _try_cast or dynamic_cast
Even if I modify the __pin* to __pin* volatile, it seems to be the same.
My tests are done with VC 2003 (CL.EXE V 13.10.3077) what version are you using?
Marcus Heege
"Tim" <Tim@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message news:22C964C9-5840-4C5F-82BE-7E24392BAADD@xxxxxxxxxxxxxxxxI'm trying to co-erce a __gc array of Byte to a __nogc pointer to char to pass to a native function call in a bit of managed c++ code like this:
Byte field __gc[] = dynamic_cast<Byte __gc[]>(record->get_Item(i));
.
.
.
Byte __pin * p = &field[0]; // << this is the proscribed way to pin a gc
array
char __nogc * pinfield = p; // << C2440 error here!
I get the following compilation error: : error C2440: 'initializing' : cannot convert from 'unsigned char __pin *volatile ' to 'char *'
Given that p is effectively a no-gc pointer to unsigned char, I can't
understand why I can't assign it to pinfield - a no-gc pointer to char (i.e.
exactly the same, just treat the chars as signed instead of unsigned).
Can anyone explain why I can't do this and how I can achieve what I'm trying
to please?
cheers
Tim
.
- References:
- Re: managed c++ pinned pointer cast
- From: Marcus Heege
- Re: managed c++ pinned pointer cast
- Prev by Date: Re: managed c++ pinned pointer cast
- Next by Date: Re: managed c++ pinned pointer cast
- Previous by thread: Re: managed c++ pinned pointer cast
- Next by thread: Re: managed c++ pinned pointer cast
- Index(es):
Relevant Pages
|