I have a MainForm. It has two child forms.
The program reads in large SEGY files (2gb -> 100gb), appropiate data and read settings are stored through the class system that has a main controller "SEGY.H" & "SEGY.CPP". They a coded in pure C++.
My two child forms are managed. I want to pass a reference for SEGY from the MainForm to each child form when they are required to be shown to the user, obviously to avoid copying large amounts of memory.
I cannot pass a native class by reference to a managed class through the managed classes constructor.
I have tried (code in mainform):
private: SEGY *Segy; //it then gets constructor call when filename is chose
CHILDFORM ^childform1( Segy ); //constructor for 1st child form that needs to be shown
where I have tried the following as constructor arguments in CHILDFORM.H
CHILDFORM(SEGY* &Segy_inputSegyContainer);
CHILDFORM(SEGY* %Segy_inputSegyContainer);
The latter works and runs (%). Debug in MainForm.h on this line shows under Locals that this->Segy points to a SEGY class with correct values. Debug following CHILDFORM constructor through into CHILDFORM.cpp shows the reference gets curropted and Segy_inputSegyContainer points to a curropted class.
Please can you help me.

Passing Unmanaged Class by reference to Managed Class Constructor
znrigtoiwqo
I think I may know the anwser. First off you should know the only valid native code in a managed class is a pointer to a unmanaged object. So any way you don't need to pass by refrence, all you have to do is pass a pointer by value. This is completly valid and will avoid copying the whole file.
Try some thing like this:
public ref class MyManaged
{
private:
SEGY* Segy;
public:
MyManaged(SEGY* Segy)
{
this->Segy = Segy;
}
};
Basically just forget passing by refrence, it is not nessasary in this case, so just remove the & and the %. BUT remember, what I just said will only hold true if you use dynamic allocation aka "new" when you first create your SEGYs, although I doubt you are making them on the stack as that would be both very uncommon and idiotic.
good luck, let us know how you made out
tokie
My test number 1:
class Test1
{
public:
Test1(int n) : data(n)
{
}
int GetData(){return data;}
private:
int data;
};
ref class Test2
{
public:
Test2(Test1& t) : test1(t)
{
}
void Print()
{
Console::WriteLine(test1.GetData().ToString());
}
private:
Test1& test1;
};
int main(array<System::String ^> ^args)
{
Test1 t1(5);
Test2 t2(t1);
t2.Print();
return 0;
}
Test number 2:
class Test1
{
public:
Test1(int n) : data(n)
{
}
int GetData(){return data;}
private:
int data;
};
ref class Test2
{
public:
Test2(Test1* t) : test1(t)
{
}
void Print()
{
Console::WriteLine(test1->GetData().ToString());
}
private:
Test1* test1;
};
int main(array<System::String ^> ^args)
{
Test1 t1(5);
Test2 t2(&t1);
t2.Print();
return 0;
}
Both versions successfully compile and run. What is your code exactly and what problem do you have
Indigo Paul
CHILDFORM(SEGY* &Segy_inputSegyContainer);
CHILDFORM(SEGY* %Segy_inputSegyContainer);
Why not SEGY*
srjing2
Thank you for taking the time to reply to my post. I basically get the following error message in "MainForm.h" when I compile
I have made a simple project that highlights the problem. The thing that makes me so cross about this is I do not feel I am doing anything radical or complicated. I simply want to use the class system to pass by reference to avoid copying memory. I just feel I haven't discovered the syntax yet.
"cannot convert parameter 1 from 'SEGY *' to 'SEGY *&'
An object from the gc heap (member of a managed class) cannot be converted to a native reference"
The simple project that highlights the problem can be downloaded at http:\\www.will-turner.co.uk\microsoftDrivingMeMad.zip