Jump to content
BKor

migrating projects to RAD Studio 12

Recommended Posts

Hello everybody,

 

I installed Rad Studio Athens ( with some graphic 3rd parties) and now I am trying to open some projects that I have done in Alexandria ( Rad Studio11).

Unfortunatelly I am not succesfull -  (access violation at address 00876830 in module "Project1.exe" (offset 6830). Read of address 000000000.)

I am working with C++ Builder and before I had no problems with migrating projects from previous versions of Rad Studio.

Any advice that could help me running older projects?

 

 

Share this post


Link to post

Try to check the stack of called methods, someone try to use a wrong pointer value or object reference.

Share this post


Link to post
2 hours ago, BKor said:

Any advice that could help me running older projects?

You can run with debugger and see what's the cause ...

Share this post


Link to post

I am not used to work with debugger or stack of called  methods. I will try it anyway. Is it of any help if ( in case of not able to interpret debugger window...) I make a screenshot of debugger window and post it?

Share this post


Link to post
16 minutes ago, BKor said:

I am not used to work with debugger or stack of called  methods. I will try it anyway. Is it of any help if ( in case of not able to interpret debugger window...) I make a screenshot of debugger window and post it?

If you post here the piece of source code interested and the screen shoot, sure someone can help you.

 

Share this post


Link to post

I tried with debugging,

it looks like there is problem with for loop:

 

for (int j=0; j<c; j++)

 

The initial value of j after running with debugging is 12 (j=12, see the image) , although it should start the loop with value j=0.

 

image.thumb.png.216811788eabffff7f0bb519b15790b3.png

 

There seems to be another problem with c, which shows no value at all.

j and c are defined as follows:

 

TForm1 *Form1;
const int c=9;
TBitmapLayer* pLayer[c];
int i,j=0;
int r;
bool slip[c]={ false };
bool bing[c]={ false };
bool bong[c]={ false };
int alpha[c]={ 0 };

.....

 

If I replace in the loop c with cc ( which is defined solely as int (int cc=9 ; ), not as const int (const int c=9;),

then the value of cc shows as expected, that is 9.

 

I might be totally wrong, never worked with a debugger before.

I attached the image of debugging window below.

Is it possible that some kind of "compile settings", which are different from previous version of RAD Studio make this problem?

Thanks for any advice.

 

 

 

 

Delphi-praxis-loop-problem.jpg

Share this post


Link to post
18 minutes ago, BKor said:

for (int j=0; j<c; j++)

 

The initial value of j after running with debugging is 12 (j=12, see the image) , although it should start the loop with value j=0.

You are inspecting the value of j too early; It hasn't been assigned a value yet. The debugger stops on the breakpoint at the location just before code is executed. Not after the code has been executed.

 

If you step one line into the loop then j will have been assigned the initial value.

Share this post


Link to post

I tried to migrate to Rad Studio 12 Athens another older project from Rad Studio 11.

I run it with debugger and it shows:

 

1) still within c++ builder window:

 

image.thumb.png.ea6610877d90d5e540447ea477288d36.png

 

2) then continues to pop up c++ builder window with:

 

image.thumb.png.810072964b668ed4fc99fc287d7525de.png

 

3) After I close all pop up windows it shows in application window another series of alerts:

 

image.thumb.png.87a9ba9c2fcd10cc047599a0650ab137.png

 

Access violation remains in first case in module rtl290.bpl and then in module Project1.exe

I could not monitor anything with debugger, because closing the alerts led me to the application with another series of alerts....

 

Hmmm, thx for any advice

 

 

 

 

1.jpg

2.jpg

3.jpg

Share this post


Link to post

I am sending the CPU window after debugging pointing to ntdll.dll

 

CPU.jpg

Share this post


Link to post
On 11/8/2024 at 11:19 PM, Anders Melander said:

You are inspecting the value of j too early; It hasn't been assigned a value yet. The debugger stops on the breakpoint at the location just before code is executed. Not after the code has been executed.

 

If you step one line into the loop then j will have been assigned the initial value.

If I press Shift F7 (trace to next source line) it throws me to the end of "void __fastcall TForm1::FormCreate(TObject *Sender)" and the j stays unchanged.

This happens even If I place breakpoints in the code.

Thx for any advice.

Share this post


Link to post

I would just use F8 (Step over) but it shouldn't make a difference.

Where do you assign a value to c and where is pLayer (which I assume is a dynamic array) initialized?

 

I think you need to show us some more code so we can make sense of what you are doing - and please use the code block.

image.thumb.png.edea673bd2eaee0efe5a513779c1cf19.png

Share this post


Link to post
22 hours ago, Anders Melander said:

I would just use F8 (Step over) but it shouldn't make a difference.

Where do you assign a value to c and where is pLayer (which I assume is a dynamic array) initialized?

 

I think you need to show us some more code so we can make sense of what you are doing - and please use the code block.

image.thumb.png.edea673bd2eaee0efe5a513779c1cf19.png

This morning I tried to send  the code (via code block) and was refused to submit as potential spam....

I will try to send you this message and afterwards another one with code.

In case I will not be allowed to send the code via code block - is there any other way for sending the code?

 

I am sending the header and upper part of the code. I hope it helps somehow.

pLayer is part of TImage32 ( graphics32 , 3rd party), defined as array,

and c is defined as const int c=9;

Pressing F8 does not make any difference.

I wonder why the debugger stops with a blue arrow anyway.

The same code is compiled and runs without problems in Alexandria.

Thx. (also for pointing out the code block ...)

Share this post


Link to post
22 hours ago, Anders Melander said:

I would just use F8 (Step over) but it shouldn't make a difference.

Where do you assign a value to c and where is pLayer (which I assume is a dynamic array) initialized?

 

I think you need to show us some more code so we can make sense of what you are doing - and please use the code block.

image.thumb.png.edea673bd2eaee0efe5a513779c1cf19.png

I was refused by "Clean Talk"...

I will try to send code as .txt in attached file....

MelanderCode.txt

Share this post


Link to post
9 hours ago, BKor said:

TForm1 *Form1;

const int c=9;
TBitmapLayer* pLayer[c];
int i,j=0;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ...
  for(j = 0; j < c; j++)
  {
    pLayer[j] = new TBitmapLayer(Form1->ImageBackground->Layers);
    pLayer[j]->Bitmap->DrawMode = dmBlend;
    pLayer[j]->Scaled=true;
  }
  ...
}

 

 

I think I can see the problem: You are referencing the Form1 global variable before it has been assigned a value; Your code is in the constructor (or more precisely: an event handler called from the constructor) and the Form1 value isn't assigned until the constructor returns.

 

Do like this instead:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ...
  for(j = 0; j < c; j++)
  {
    pLayer[j] = new TBitmapLayer(this->ImageBackground->Layers);
    pLayer[j]->Bitmap->DrawMode = dmBlend;
    pLayer[j]->Scaled=true;
  }
  ...
}

or simply:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ...
  for(j = 0; j < c; j++)
  {
    pLayer[j] = new TBitmapLayer(ImageBackground->Layers);
    pLayer[j]->Bitmap->DrawMode = dmBlend;
    pLayer[j]->Scaled=true;
  }
  ...
}

 

Of course it would be best if you could avoid all those global variables (not Form1 but all the others). I don't know if they were just there for debugging this problem.

Edited by Anders Melander

Share this post


Link to post
13 hours ago, Anders Melander said:

 

I think I can see the problem: You are referencing the Form1 global variable before it has been assigned a value; Your code is in the constructor (or more precisely: an event handler called from the constructor) and the Form1 value isn't assigned until the constructor returns.

 

Do like this instead:


void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ...
  for(j = 0; j < c; j++)
  {
    pLayer[j] = new TBitmapLayer(this->ImageBackground->Layers);
    pLayer[j]->Bitmap->DrawMode = dmBlend;
    pLayer[j]->Scaled=true;
  }
  ...
}

or simply:......

Of course it would be best if you could avoid all those global variables (not Form1 but all the others). I don't know if they were just there for debugging this problem.

 

I have tried both suggestions, but that did not make any difference.

The debugger again stops with a blue arrow at the loop line.

If I press F8 to go to the next line of code - a blue arrow goes to the end of    void __fastcall TForm1::FormCreate(TObject *Sender) - as before.

 

Thx!

 

 

Share this post


Link to post
1 hour ago, Anders Melander said:

And did you replace all the Form1-> with this-> ?

Yes, I did.

I have a feeling that if I would newly rewrite the same code in Athens - that it would work normally (as it does in Alexandria).

I will try that tomorrow and let you know...

Share this post


Link to post
32 minutes ago, BKor said:

I have a feeling that if I would newly rewrite the same code in Athens - that it would work normally (as it does in Alexandria).

Sounds like a good plan.

But please use version numbers instead of marketing names. I have no idea what versions Athens or Alexandria refers to - nor do I care to know.

Share this post


Link to post
20 hours ago, Anders Melander said:

Sounds like a good plan.

But please use version numbers instead of marketing names. I have no idea what versions Athens or Alexandria refers to - nor do I care to know.

I was wrong. Rewriting the code in RadStudio 12 did not work.

When compiling it gives: 

Access violation at address 6CE9D636 in module 'rtl290.bpl' (offset 11D636). Read at address 006C005E.

When debugging it stops at loop, as before.

 

I would like to delete some of my previous messages (ones with tons of images), is this possible?

Share this post


Link to post
10 minutes ago, BKor said:

When compiling it gives: 

Access violation at address 6CE9D636 in module 'rtl290.bpl' (offset 11D636). Read at address 006C005E.

Are you saying that you get an exception when compiling the code? I think you mean when running the code.

 

Going back and looking at your screenshots, I can see that the exception probably occurs in some paint code. That's why you get the cascading errors. A repaint causes an error which triggers a new repaint which causes an error, etc. etc.

 

2 minutes ago, BKor said:

I was wrong. Rewriting the code in RadStudio 12 did not work.

If you can reduce the project to the smallest possible case that reproduces the problem and post the code in a zip file, then maybe some of those here that actually use C++ (I don't) can have a go at it.

For example, if you remove all the 3rd party stuff (including Graphics32), can you still reproduce the problem?

 

4 minutes ago, BKor said:

I would like to delete some of my previous messages (ones with tons of images), is this possible?

No.

Share this post


Link to post

Yes, I mean running the code.

I will remove the 3rd party stuff and see what happens. And then also reinstall the 3rd parties.

Thx...

 

Share this post


Link to post
On 11/21/2024 at 11:49 AM, BKor said:

If I press F8 to go to the next line of code - a blue arrow goes to the end of    void __fastcall TForm1::FormCreate(TObject *Sender) - as before.

A word of advice - in C++, NEVER use the Form's OnCreate and OnDestroy events!  (they are perfectly safe to use in Delphi only).

 

The events are based on Delphi's object creation model (derived classes created before base classes), which is different than C++'s creation model (base classes created before derived classes).

 

Also, their behavior has changed a few times over the years (due to internal changes [and bugs] related to handling of the TForm.OldCreateOrder property), so they are not always consistent in C++.

 

As such, the events can be called before the Form's C++ constructor and after its destructor, respectively (I've seen it happen), which leads to undefined behavior in C++.

 

In C++, ALWAYS use the Form's actual constructor/destructor instead.

Edited by Remy Lebeau
  • Like 4

Share this post


Link to post
On 11/23/2024 at 7:40 AM, Remy Lebeau said:

 

In C++, ALWAYS use the Form's actual constructor/destructor instead.

If it is not too much, can I kindly ask you if you can show me how to ( in a simple example?),  use the Form's actual constructor/destructor in c++ builder?

Share this post


Link to post
1 hour ago, BKor said:

If it is not too much, can I kindly ask you if you can show me how to ( in a simple example?),  use the Form's actual constructor/destructor in c++ builder?

Like this:

class TForm1 : public TForm
{
	...
private:
	static const int c = 9;
	TBitmapLayer* pLayer[c];
public:
	__fastcall TForm1(TComponent *Owner);
	__fastcall ~TForm1();
	...
};
__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
	...
	for(int j = 0; j < c; ++j)
	{
		pLayer[j] = new TBitmapLayer(ImageBackground->Layers);
		pLayer[j]->Bitmap->DrawMode = dmBlend;
		pLayer[j]->Scaled = true;
		...
	}
	...
}
    
__fastcall TForm1::~TForm1()
{
	...
	for(int j = 0; j < c; ++j)
	{
		delete pLayer[j];
	}
	...
}

 

 

Edited by Remy Lebeau

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×