|
Try reading this one
clickety[^]
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi,
Need some help regarding unsafe code.
Am trying to get create an array of pointer to a struct, and not getting through with it.
here is a sampe code
public struct RoomDef
{
public ushort Id;
public string Name;
public string Status;
public string Location;
}
Within a function i have coded the following.
RoomDef* []nee = new RoomDef();
unsafe
{
testPtr = new RoomDef();
nee[1] = & testPtr;
}
This is just a snippet of the code and there are no Syntax errors anywhere. But while I compile it gives me an error stating "Cannot take the address of, get the size of, or declare a pointer to a managed type"
Have tried using the Fixed statement as well, still no go.
I can get the address of the individual members of the structure. But not the structure itself.
Any help will be appreciated.
modified on Wednesday, September 17, 2008 8:51 AM
|
|
|
|
|
First the length of the nee array is only one, so nee[1] goes past the end. Second, testPtr is the managed type. It's already a pointer so you don't need to take the address of it.
Try: nee [1] = testPtr;
|
|
|
|
|
Thanks for the Reply,
I have handled the array part. But no, nee [1] = testPtr; does not work.
|
|
|
|
|
Alan Balkany wrote: testPtr is the managed type. It's already a pointer so you don't need to take the address of it.
No, as it's a value type, testPtr isn't a pointer at all.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
I think you can have a pointer to a value type. When you make a struct with 'new' I think it's allocated in the heap. I think structs are only put on the stack when they're local variables.
|
|
|
|
|
See any work around for it?
|
|
|
|
|
I'm still looking at it. I suspect a class instead of a struct would work, but I still think a struct should work. Give me a few minutes...
|
|
|
|
|
I have tried using a class , no luck
|
|
|
|
|
This works:
public struct RoomDef
{
public ushort Id;
public string Name;
public string Status;
public string Location;
};
private void Form1_Load(object sender, EventArgs e)
{
RoomDef []nee = new RoomDef[5];
RoomDef testPtr = new RoomDef();
nee[1] = testPtr;
}
The 'struct' can be replaced with 'class' and it still works.
I suspect the array of structs is five 14-byte structures that follow each other in memory. But if a class is used, I suspect the array is five 4-byte pointers to RoomDef objects allocated in the heap.
It's hard to test this theory because using the sizeof() operator generates a compile error.
|
|
|
|
|
Thanks Alan,
But then, the code above declares an array of structures rather than an array of pointers isnt it? Correct me if am wrong, please.
|
|
|
|
|
If you substitute 'class' for 'struct' it will be an array of pointers. Classes are implemented as pointers to the data in the heap.
|
|
|
|
|
Alan Balkany wrote: I suspect the array of structs is five 14-byte structures that follow each other in memory.
Actually it's five 16-byte structures that follow each other in memory. The members in the struct are padded to the next word boundary, so there is two unused bytes after the ushort.
Alan Balkany wrote: But if a class is used, I suspect the array is five 4-byte pointers to RoomDef objects allocated in the heap.
The array is five references (4 or 8 bytes depending on the platform), however no RoomDef objects are created to populate the array when the array is created. All the references are null from start.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks for the clarifications, Guffa.
|
|
|
|
|
I noticed an interesting quirk in C#: You can only use the sizeof() operator on a struct if it only contains value types. Replacing the three string members in RoomDef with ushort allows sizeof() to be used on the struct.
|
|
|
|
|
Alan Balkany wrote: I think you can have a pointer to a value type.
Yes, you can, but the variable we are talking about is not a pointer.
Alan Balkany wrote: When you make a struct with 'new' I think it's allocated in the heap.
No, it's not. The constructor only creates the value, it's not allocated anywhere. In this case the value is then assigned to the local variable.
Alan Balkany wrote: I think structs are only put on the stack when they're local variables.
It is a local variable.
Besides, a struct is never allocated on the heap by itself. A struct can be a part of a class that is allocated on the heap, it can be part of an array that is allocated on the heap, or it can be boxed inside an object that is allocated on the heap, but never on it's own.
Despite everything, the person most likely to be fooling you next is yourself.
modified on Wednesday, September 17, 2008 2:55 PM
|
|
|
|
|
You should use a class instead of a structure, so that you can allocate instances of it that will survive the local scope.
If you would have succeeded in putting the pointer in the array, it would be a pointer to the structure allocated in the stack frame of the method. When you return from the method, the structure doesn't exist any more, so the pointer is no longer valid.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks for the Reply,
Will c heck as a class, but then any idea why it gives me an compile error when i do it this way?
|
|
|
|
|
Preetham.N wrote: any idea why it gives me an compile error
Which compile error?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Have tried using a class , no luck
|
|
|
|
|
Thanks Guys
Changed it to Class. Works
|
|
|
|
|
I am developing ASP.Net Applciation.I have a requirement to store the data into Application object whose data rarely changes.So the Application Object should be refershed with the Updated data once in a day.For that How to Set Expiration Policy to an Application Object in ASP.Net Applciation?
|
|
|
|
|
Keep a timestamp with the object. Whenever you access object, check this timestamp and reload it when necessary. I think you can use cache with your expiry time. So runtime manages it automatically.
BhanuRegonda wrote: I am developing ASP.Net Applciation.
BTW, you are in wrong forum. You could try ASP.NET forum.
|
|
|
|
|
I am trying to create a control that displays a type of threshold.
I have 3 numeric up down controls that take an input from the user. Depending on the input I update the below control. The control is made up of 3 blocks of colour. Each block represents a numeric up down value.
_______________
| y | o | r |
_______________
(y = yellow, o = orange, r = red)
So for instance, yellow is 5, orange is 8 and red is 10. I then need to update the size of the blocks to represent them.
This would then display the blocks correctly, so that 0 - 50% of the control is yellow, 50 to 80% is orange and the last 80 to 100% is red. However, these are only example values, the values could be anything and not in order, eg: 10, 5, 20
Does anyone know how to do this?, I am sure there is a simple maths way, but I cannot think of it at the moment.
Regards,
Gareth.
(FKA gareth111)
|
|
|
|
|
Can you please clarify one of my question.If we are trying incerese any value for any of the block,does it need to impact the sizes of respective blocks or are they fixed with the 0-50% Yellow,50-80% Red,etc.,?
|
|
|
|