Assigned(TStopWatch) gives E2008 - delphi-10.1-berlin

if assigned(S3) then Log('TChunkManager.UpdateVertices Create VAO ms: ' +
S3.ElapsedMilliseconds.ToString);
The problem is the assigned part, I tried with Log('aaa') and also Log works fine elsewhere. Why is S3 (TStopwatch) is uncompatible with assigned?
**[dcc64 Error] thChunkManager.pas(529): E2008 Incompatible types**
How can I check if S3 is created or not?

TStopWatch is a record type, not a class type. An instance of a record can be created in stack memory of the calling thread. An instance of a class type must be allocated dynamically in heap memory instead. Only pointers can be passed to Assigned(). A record instance on the stack doesn't count.
For what you are attempting, you probably want to use the TStopWatch.IsRunning property instead:
if S3.IsRunning then
Log('TChunkManager.UpdateVertices Create VAO ms: ' + S3.ElapsedMilliseconds.ToString);

Related

If instances are really just pointers to objects in Python, what happens when I change the value of a data attribute in a particular instance?

Suppose I define "Class original:" and create a class attribute "one = 4." Then I create an instance of the class "First = original()." My understanding is that First now contains a pointer to original and "First.one" will return "4." However, suppose I create "Second = original()" and then set "Second.one = 5." What exactly happens in memory? Does a new copy of Class original get created with a class attribute of 5?
I've created a Class original with class attribute one. I then created two instances of this class (First and Second) and verified that id(First.one) and id(Second.one) are pointing to the same place. They both return the same address. However, when I created Third=original() and set Third.one = 5 and then check id(Thrid.one) it appears to be pointing somewhere else. Where is it pointing and what happened? When I check original.one it still returns "4" so obviously the original object is not being modified. Thanks.
It appears you are asking about a piece of code similar to this:
class Original:
def __init__(self, n):
self.one = n
first = Original(4)
second = Original(4)
third = Original(5)
print(id(first.one))
# 140570468047360
print(id(second.one))
# 140570468047360
print(id(third.one))
# 140570468047336
Suppose I define "Class original:" and create a class attribute "one = 4." Then I create an instance of the class "First = original()." My understanding is that First now contains a pointer to original
No. The variable references the instance you created, not the class. If it referenced the class, there would be no way for you to get at the instance you just created.
The instance will, somewhere in its object header, of course contain a pointer to its class. Without that pointer, method lookup wouldn't be possible, since you wouldn't be able to find the class from the instance.
and "First.one" will return "4."
Yes. The attribute one of first contains a pointer to the object 4 (which is an instance of the class int).
[Note that technically, some Python implementations will perform an optimization and actually store the object 4 directly in the attribute instead of a pointer to the object. But that is an internal implementation detail.]
However, suppose I create "Second = original()" and then set "Second.one = 5." What exactly happens in memory? Does a new copy of Class original get created with a class attribute of 5?
No. Why would you need a separate copy of the class? The methods are still the same for both instances. In fact, that is precisely the reason why methods in Python take the instance as their first argument! That way, there need only be one method. (This is actually the same in every OO language, except that in most other languages, this argument is "invisible" and only accessible using a special keyword like self in Ruby, Smalltalk, Self, and Newspeak or this in Java, C#, and Scala.)
I've created a Class original with class attribute one. I then created two instances of this class (First and Second) and verified that id(First.one) and id(Second.one) are pointing to the same place. They both return the same address. However, when I created Third=original() and set Third.one = 5 and then check id(Thrid.one) it appears to be pointing somewhere else.
It is not quite clear to me what your question is here. first.one and second.one both point to 4, so they both point to the same ID since they both point to the same object. third.one points to 5, which is obviously a different object from 4, so naturally, it has a different ID.
It is, in fact, one of the requirement of IDs that different objects that exist at the same time must have different IDs.
Where is it pointing and what happened?
Again, it is not quite clear what you are asking.
It is pointing at 5, and nothing happened.
When I check original.one it still returns "4" so obviously the original object is not being modified.
Indeed, it isn't. Why would it be?

What is "spill" in the context of Nashorn ScriptObjects?

I'm profiling some of our Nashorn code. We pool and re-use our ScriptContexts between executions. I've noticed the ScriptContext is leaking memory somewhere, and I can trace it back to the spill attribute in the Global class:
What does the spill do? Is there any way to clear it?
if you add properties to an object after it is created like "obj.x = 34" after "obj" is created and initialized, Nashorn creates "spill" area or expands already created "spill" area to hold these additional properties. If you initialize all properties at the constructor (or in an object literal), then there won't be any "spill" area in that object. Global is inherently "expanding" object forever - as you eval more code you keep creating more variables. So, there would be a spill for global.

sizeof object varies with context

In Win CE 6.0, class TankObject is defined in a static library, C++ compiler is VS2008; target is ARM4 (/QRarch4).
An instance of class TankObject is constructed by a call of the form
*TankObject myTankObject = new TankObject(parm1, parm2 ...);
Last attribute declared in TankObject definition is an object pointer, and when an assignment is made to same, memory corruption of another dynamically allocated object occurs.
Step into constructor reveals that operator new is called with a size of 0x500. sizeof(TankObject) reveals two different values, depending on the context:
In instantiating context (the application), sizeof(TankObject) and sizeof(*myTankObject) is 0x500.
In context of the object itself (the constructor, or object methods), sizeof(TankObject) and sizeof(*this) is 0x508. The address of last declared attribute is 0x500, relative to object.
The call to new requests and receives 0x500 bytes. The object itself expects and uses 0x508 bytes, which can cause assignments to last attribute to step on other dynamically allocated objects.
Work around is to declare another unused attribute at the end of the object definition, to pad the request to new.
Both contexts include the same .h file, to debug I changed include statement to an explicit path name. I also went through compiler switches, made them identical. So I am puzzled, if any one can shed light, I'm glad, I would like to know a proper solution.

How to avoid returning a temporary object (C++)

The code below is showing a poor example of memory management; item is never de-allocated because a temporary copy of it is returned instead.
I've been scouring programming forums on and off for weeks but haven't found a clear explanation as to how to properly return a valid instance of type Item* while allowing item to be de-allocated.
In other words, what is a better alternative to this code that accomplishes the same return value and yet allows item to be de-allocated?
Item* Inventory::add(const string& name)
{
Item* item = new Item(name);
...(some other code here)...
return item;
}
Thanks!
You might think everything is destroyed once it goes outside the loop, but the pointer that is returned (and the memory that it points to) will stay. It is transferred to the object that calls this method, and no memory is leaked.

NSFetchResults update delegate works first time, crashes second time

I've looked around SO for similar answers, but my issue seems a litte different.
I have a UITableView that is tied to a NSFetchResultsController. The goal is to pull up some data, add a couple rows into the Context, and the table is automatically updated. Simple, right?
init -> empty table -> performFetch -> create some objects in the Context -> delegate sees this and updates my table.
I'm using the boilerplate NSFetchResultsController for noticing when the current context has been modified.
When I run this with a clean Simulator/iOS platform, the NSFetchController successfully recognizes that data in the Context has been updated. But if I run the app a second time, I get the following error:
CoreData: error: Serious application error. Exception was caught during Core Data change
processing. This is usually a bug within an observer of
NSManagedObjectContextObjectsDidChangeNotification. *** -[__NSArrayI objectAtIndex:]:
index 40 beyond bounds for empty array with userInfo (null)
The crash occurs on calling [self.tableView beginUpdates];
In my debugging I can see that '[fetchedResultsController fetchedObjects]' is completely empty and I think thats the problem - shouldn't this be updating with my test data since I modified the context? I'm using the Apple Recipe and CoreDataBooks examples as reference.
I think this is because you Data Modle in class just not fit the entity in you .xcdatamodeld file.

Resources