Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / Managed C++ / April 2008

Tip: Looking for answers? Try searching our database.

error C2061: syntax error : identifier 'ref'

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Pixel.to.life - 21 Apr 2008 08:32 GMT
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.
Ben Voigt [C++ MVP] - 21 Apr 2008 14:37 GMT
> 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)
>       {
[quoted text clipped - 11 lines]
>
> 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) { ... }

> Thanks a lot!
>
> -P.
Pixel.to.life - 21 Apr 2008 17:10 GMT
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);

> > Problem#2:
> > Anyways, I chose to classify this parameter as a reference variable,
[quoted text clipped - 32 lines]
>
> - Show quoted text -
Ben Voigt [C++ MVP] - 21 Apr 2008 17:26 GMT
> 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?

> I call it like this:
>
[quoted text clipped - 42 lines]
>>
>> - Show quoted text -
Ben Voigt [C++ MVP] - 21 Apr 2008 18:43 GMT
> Thanks Ben.
>
[quoted text clipped - 10 lines]
>
> 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.
Pixel.to.life - 22 Apr 2008 05:44 GMT
> > Thanks Ben.
>
[quoted text clipped - 36 lines]
>
> - 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:-)
Ben Voigt [C++ MVP] - 22 Apr 2008 14:33 GMT
> Ben,
>
[quoted text clipped - 3 lines]
>
> Hope I can be of some use to you too someday:-)

You're welcome.

Rate this thread:







Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.