Re: managed c++ pinned pointer cast

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



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@xxxxxxxxxxxxxxxx
I'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





.



Relevant Pages

  • Re: Strange problem on GCC - PLEASE HELP!!
    ... be a pointer to char, and you are passing pointer to unsigned char. ... Do not pass pointers to character arrays that are not strings to ...
    (comp.lang.c)
  • Re: Problem with va_ macros and arrays of arrays
    ... > the arrays passed to a ... > specific char, somewhat similar to what the standard function ... that with an array of struct, or possibly a pointer to a dynamic array ... > As I'm still a beginner in C without a copy of the standard I ...
    (comp.lang.c)
  • Re: Insufficient guarantees for null pointers?
    ... will the compiler know what the bounds are after converting that char * ... to an int *, if it could point to either of two arrays which happen to ... compares equal to the original pointer. ...
    (comp.std.c)
  • Re: Q: Trouble with wsprintf
    ... to a pointer to unsigned char. ... signed char, unsigned char, and "plain" char, defined without either ...
    (alt.comp.lang.learn.c-cpp)
  • Re: class pointers
    ... New material you add belongs after the ... >> That means that the function returns a pointer to an unsigned char. ...
    (comp.lang.cpp)