?
Solved

C++/CLI -- address of operator

Posted on 2009-05-16
10
Medium Priority
?
920 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
10 Comments
 
LVL 86

Assisted Solution

by:jkr
jkr earned 200 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 200 total points
ID: 24404088
I think you need:

MyFunction(^%MyInt);
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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
 
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 800 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

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
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 goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
Suggested Courses

764 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