Solved

C++/CLI -- address of operator

Posted on 2009-05-16
10
889 Views
Last Modified: 2012-05-07
Consider this code in Managed Extensions for C++ (.Net 1.1)

int MyInt;

MyFunction(&MyInt);

That calls MyFunction with the address of MyInt, because MyFunction wants an int*.

Now, in .Net 2+, MyFunction wants an int^.

So ... how do I call it?  If I say
MyFunction(%MyInt);
I am told Error C3071: % can only be applied to an instance of a ref class or a value type.

I would have thought that int was a value type.

So again, how do I call MyFunction?

Thanks!
0
Comment
Question by:Daniel Wilson
10 Comments
 
LVL 86

Assisted Solution

by:jkr
jkr earned 50 total points
ID: 24403499
Did you mean

MyFunction(&MyInt);

?

'%' is the modulus operator.
0
 
LVL 32

Author Comment

by:Daniel Wilson
ID: 24403580
yes, % is modulus.

And in real C++, it has no other meaning, to my knowledge.

But in C++/CLI it is similar to &.  See the "tracking reference" section here:
http://en.wikipedia.org/wiki/C%2B%2B/CLI
0
 
LVL 40

Assisted Solution

by:mrjoltcola
mrjoltcola earned 50 total points
ID: 24404088
I think you need:

MyFunction(^%MyInt);
0
 
LVL 9

Expert Comment

by:tculler
ID: 24404444
I think what the function wants is a handle to an Int32^. I may be wrong, but the following demonstration should be along the lines you're looking for:
System::Int32 someInt;
 

MyFunction(%someInt);

Open in new window

0
 
LVL 32

Author Comment

by:Daniel Wilson
ID: 24404498
MyFunction(^%MyInt);
does not compile.  In addition to C3071, I get:
C2100: Illegal indirection
C3192: Syntax Error: '^' is not a prefix operator. (Did you mean '*' ?)
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 32

Author Comment

by:Daniel Wilson
ID: 24404501
System::Int32 someInt;
 
MyFunction(%someInt);

This doesn't compile either.  I still get C3071.

Thanks to both of you for your ideas.  Do you have more I can try?

0
 
LVL 32

Author Comment

by:Daniel Wilson
ID: 24404542
Another overload out there for MyFunction is
static void MyFunction(System::IntPtr x);

I do find that the call MyFunction(MyInt); compiles.  Will I be sorry if I go with this?
0
 
LVL 9

Assisted Solution

by:tculler
tculler earned 200 total points
ID: 24404729
Well, have you tried just using the address-of operator? It may actually be looking for a pointer to a native int.

System::IntPtr would be ok; it's just a wrapper for a pointer to an int. That structure is usually used for things like managed handles. The .NET Framework rather dislikes pointers, so they created a special wrapper just for that reason. For example, in C#, to even work with pointers at all, you must compile with a /unsafe switch, on top of having the pointer-utilizing code within a block marked as unsafe.

Anyways, that call should work just fine. If the overload requests it and it compiles, I see no reason it should be the wrong thing.

By the way, int and Int32 are very different in C++, but yes, they are value types. I'm not sure why it doesn't let you use the % operator on it; that error message is incorrect in assuming int is not a value type.
0
 
LVL 32

Author Comment

by:Daniel Wilson
ID: 24411328
>>Well, have you tried just using the address-of operator?

& ?  Yes, I started there.  But I get C2665: 'MyFunction': none of the X overloads could convert all the argument types


Of course, MyFunction is not really mine.  I'm working against the Tao Framework which is written in C#.

One of the functions is this one, the 2nd parameter being my problem one:
        public static extern int ChoosePixelFormat(IntPtr deviceContext, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor);

Another is this, again the 2nd parameter being the one in question.        
        public static
        void glGenTextures(Int32 n, [Out] IntPtr textures)
0
 
LVL 32

Accepted Solution

by:
Daniel Wilson earned 0 total points
ID: 24411420
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

The following diagram presents a diamond class hierarchy: As depicted, diamond inheritance denotes when two classes (e.g., CDerived1 and CDerived2), separately extending a common base class (e.g., CBase), are sub classed simultaneously by a fourt…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now