error C2061: syntax error : identifier 'ref'

P

Pixel.to.life

So I have this perfectly fine and running app, that uses managed C++
forms.

Problem#1:


[1] I pass a Bitmap reference to a class, hoping to modify it in one
of the class's methods, so it reflects outside too. Something like
this:


// In a form's scope
Bitmap ^m_Bitmap;


// A separate class
template<typename T> ref class ManagedImageModifier
{
public:
...
...


bool ChangeImage(Bitmap^ iImage)
{
// change iImage here
....
return true;
};



};


This builds fine. The problem is that iImage has a different address
in memory than the reference I pass in. Obviously this means any
change to iImage isnt reflected outside. This came as a surprise
initially to me as I am new to managed programming.

Problem#2:
Anyways, I chose to classify this parameter as a reference variable,
by using 'ref' keyword. Something like this


bool ChangeImage(ref Bitmap^ iImage)
{
// change iImage here
....
return true;
};


And now I get this compile error:


error C2061: syntax error : identifier 'ref'


Note that the same keyword when used to classify the class
ImageModifier wasnt giving me errors.


Any clues on whats going on here????


Thanks a lot!


-P.
 
B

Ben Voigt [C++ MVP]

Problem#2:
Anyways, I chose to classify this parameter as a reference variable,
by using 'ref' keyword. Something like this

This is the right thing to do, but the wrong syntax.
bool ChangeImage(ref Bitmap^ iImage)
{
// change iImage here
....
return true;
};


And now I get this compile error:


error C2061: syntax error : identifier 'ref'


Note that the same keyword when used to classify the class
ImageModifier wasnt giving me errors.


Any clues on whats going on here????

C# uses the ref keyword for this. C++ already had language syntax for
reference parameters, so C++/CLI adapted that instead of following C#.

Try

bool ChangeImage(Bitmap^% iImage) { ... }
 
P

Pixel.to.life

Thanks Ben.

I tried that, now it compiled file. But the memory address of the
original image and the one I receive inside ChangeImage(..) is still
different. Is there a rul for calling this method too?

I call it like this:

// In a form's scope
Bitmap ^m_Bitmap;


ManagedImageModifier<MyModifier> modifier;

bool result = modifier.ChangeImage(m_Bitmap);
 
B

Ben Voigt [C++ MVP]

Pixel.to.life said:
Thanks Ben.

I tried that, now it compiled file. But the memory address of the
original image and the one I receive inside ChangeImage(..) is still
different. Is there a rul for calling this method too?

It's a garbage collected object, so it can move around in memory. That's
why ^ and % ("tracking" pointer and reference) instead of * and &.

Can you verify whether the function was able to change the caller's copy of
the variable?
 
B

Ben Voigt [C++ MVP]

Pixel.to.life said:
Thanks Ben.

I tried that, now it compiled file. But the memory address of the
original image and the one I receive inside ChangeImage(..) is still
different. Is there a rul for calling this method too?

I call it like this:

// In a form's scope
Bitmap ^m_Bitmap;


ManagedImageModifier<MyModifier> modifier;

bool result = modifier.ChangeImage(m_Bitmap);

Does it still misbehave when simplified?

Try this:

Bitmap ^m_Bitmap;

m_Bitmap = gcnew Bitmap(64, 64);
::System::Diagnostics::Trace::WriteLine("m_Bitmap " + ((m_Bitmap ==
nullptr)? "is": "is not") + " NULL");
ChangeImage(m_Bitmap);
::System::Diagnostics::Trace::WriteLine("m_Bitmap " + ((m_Bitmap ==
nullptr)? "is": "is not") + " NULL");

bool ChangeImage(Bitmap^% bmp) { bmp = nullptr; return true; }

Then move ChangeImage into your template class as a static method, call it
there, test again.
Then make ChangeImage an instance method, test again.
Then start adding the ChangeImage logic.

I suspect that ChangeImage didn't reach the line which reassigned the
parameter to a new value. It is declared with a return value but you aren't
checking it.
 
P

Pixel.to.life

Does it still misbehave when simplified?

Try this:

Bitmap ^m_Bitmap;

m_Bitmap = gcnew Bitmap(64, 64);
::System::Diagnostics::Trace::WriteLine("m_Bitmap " + ((m_Bitmap ==
nullptr)? "is": "is not") + " NULL");
ChangeImage(m_Bitmap);
::System::Diagnostics::Trace::WriteLine("m_Bitmap " + ((m_Bitmap ==
nullptr)? "is": "is not") + " NULL");

bool ChangeImage(Bitmap^% bmp) { bmp = nullptr; return true; }

Then move ChangeImage into your template class as a static method, call it
there, test again.
Then make ChangeImage an instance method, test again.
Then start adding the ChangeImage logic.

I suspect that ChangeImage didn't reach the line which reassigned the
parameter to a new value.  It is declared with a return value but you aren't
checking it.- Hide quoted text -

- Show quoted text -

Ben,

That worked like a charm.

Thanks a ton. I was stuck on this for almost a day!!!

Hope I can be of some use to you too someday:)
 
B

Ben Voigt [C++ MVP]

Ben,
That worked like a charm.

Thanks a ton. I was stuck on this for almost a day!!!

Hope I can be of some use to you too someday:)

You're welcome.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top