• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 934
  • Last Modified:

C++/CLI -- address of operator

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
Daniel Wilson
Asked:
Daniel Wilson
4 Solutions
 
jkrCommented:
Did you mean

MyFunction(&MyInt);

?

'%' is the modulus operator.
0
 
Daniel WilsonAuthor Commented:
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
 
mrjoltcolaCommented:
I think you need:

MyFunction(^%MyInt);
0
Technology Partners: 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!

 
tcullerCommented:
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
 
Daniel WilsonAuthor Commented:
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
 
Daniel WilsonAuthor Commented:
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
 
Daniel WilsonAuthor Commented:
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
 
tcullerCommented:
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
 
Daniel WilsonAuthor Commented:
>>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

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now