|
Hi Mark,
aww im so stupid hehe i got it now.
Thanks,
Jayjay
|
|
|
|
|
Hello everyone,
Just a basic question about when (in what scenarios typelib) will be used, the current two scenarios I could think of are,
1. using typelib to browse information (e.g. type information) of a specific type;
2. universal marshaller using typelib to marshall.
Are there any other usage scenarios?
BTW: typelib is generated by IDL file from MIDL compiler, are there any other ways to generate typelib?
thanks in advance,
George
|
|
|
|
|
Hello,
I'm creating a CScrollView , onto which I draw things by overloading OnDraw(). In the View's OnPrint, I call OnDraw with the printing device context as an argument.
BOOL CMyScrollView::OnPreparePrinting(CPrintInfo* pInfo)
{
pInfo->SetMinPage(1);
pInfo->SetMaxPage(num_pages);
return CScrollView::DoPreparePrinting(pInfo);
}
void CMyScrollView::OnPrint(CDC *pDC, CPrintInfo *pInfo)
{
CurPage = (pInfo->m_nCurPage - 1);
OnDraw(pDC);
CScrollView::OnPrint(pDC,pInfo);
}
This has worked for me elsewhere, but, for reasons I have not yet successfully isolated, it does not work here as I'd like it to. I can view print previews, and can go forward to the next page, but not back to the previous, and I can zoom in but cannot zoom out. I have attempting to debug the problem with little success. Any insights that might help me to solve this problem would be greatly appreciated,
Regards,
Sternocera
|
|
|
|
|
Hello to everyone (as this is my first question here)
I'm trying to understand how class members aligned (with msvc compiler). I was expecting that this would be identical with a struct. And it is as long as the class doesn't contain virtual methods. But when it does sometimes are equal sometimes not. For example
struct s {
unsigned* p;
int n;
double d;
};
class cc {
public:
virtual void msg() { cout<<"c::msg"<<endl; }
private:
int n;
double d;
};
thanks in advance
modified on Tuesday, August 12, 2008 6:03 PM
|
|
|
|
|
That is probably because your allignment is set to 8. Try setting it to 4,and you should get sizes 8 and 12.
Bram van Kampen
|
|
|
|
|
Thanks for the quick response Bram.
Unfortunately this is not my problem. So let me make it more clear. I have a class with a virtual method (or two or a hudrent, there is no difference), an integer and a double and a 32bit os. So i expect to get 4 bytes for the vptr, 4 bytes for the int, 8 for the double and no need for padding anywhere between, because they are already aligned. Exactly what i have in the struct (pointer, int, double). Why do i get different sizes and member alignment?
modified on Tuesday, August 12, 2008 6:03 PM
|
|
|
|
|
Point Taken! Well, experimenting a bit, and checking offsetof(Struct,n) vs offsetof(Class,n), it appears that the compiler for it's own reason sets aside 8 bytes for the vtable pointer.
For one thing, you can be sure that this is and will be always these 8 bytes. The Entire COM architecture relies on the proposition that a Class with a virtual function equals a vtable Pointer followed by a structure. The C interface and the CPP interface are both able to work with the same data. If this were to change, the entire COM machinery would break.
Bram van Kampen
|
|
|
|
|
Sorry, no luck
If I get rid of the double in the class, I have 8 bytes size only
|
|
|
|
|
Its same for class and struct. For instance, Add a virtual function to struct s and you'll get the sizeof struct s as 24.
struct s {
virtual void msg() { cout<<"c::msg"<<endl; }
int n;
double d;
};
If you disable padding and check the size of class cc , you'll get 16 bytes for your class.
#pragma pack(1)
class cc {
public:
virtual void msg() { cout<<"c::msg"<<endl; }
private:
int n;
double d;
};
The point is, if your class have vtable, for some reason, compiler is adding a 4 bytes padding between vtbl ptr and other member variables. If you disable padding, it will be removed. I'm not sure about the purpose.
Well, I hope atleast my reply helped you to some extend.
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|
>>if your class have vtable, for some reason, compiler is adding a 4 bytes padding between vtbl ptr and other member variables
Thanks for the reply Jijo.
As I mentioned before, this doesn't seems to be a rule. If I have virtual methods and just an integer for data member, there is no padding. The size is 8 bytes.
I'm working on a small tutorial about inheritance, virtual calls etc in c++. Alignment is not a subject here, but since I demonstrate datamember access via offsets from the base address, I just want a clue why this happens, not the complete explanation.
modified on Wednesday, August 13, 2008 8:11 AM
|
|
|
|
|
Hi,
I've bookmarked this conversation. It merrits more investigation, particularly the effect of declaring a double. Sometimes MS has rules for their own reasons. My COM argument still stands I think. It may be a surrepticcious rule MS introduced to cover a previous bug. At least, it is unexpected behaviour.
Bram van Kampen
|
|
|
|
|
I have a static library project that includes a large collection of C++ classes. Before any object of a class in the library is instantiated I need to call a special function, CallMeFirst(). Additionally, after all objects have been deleted, I need to CallMeLast(). What would be an appropriate architecture to use to enforce this for any application that would then compile/link with this library. I trying to see if I can code the calls to CallMeFirst and CallMeLast just once and not have to "recode" them for every application. Thanks for any comments.
Chris Meech
I am Canadian. [heard in a local bar]
In theory there is no difference between theory and practice. In practice there is. [Yogi Berra]
|
|
|
|
|
Chris Meech wrote: I trying to see if I can code the calls to CallMeFirst and CallMeLast just once and not have to "recode" them for every application.
You want the calls in the library then? If so, I suppose every constructor
would need to check if the call has been made and make the call if not.
A feference count could be used to indicate when to call CallMeLast
(from the destructors).
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
That's kinda of what's in use now, but it leaks because the call to CallMeLast is in the dtors. However it has to be made after the last dtor call has been completed. Similarly the call to CallMeFirst has to be made before any ctor is called. For example this code leaks at best and depending upon what SomeClass is, can crash.
{
CallMeFirst();
...
SomeClass ObjectA;
...
ObjectA.DoSomeStuff();
...
CallMeLast();
} This above leaks or crashes because the dtor of SomeClass is called after the CallMeLast. Whereas the following code is fine.
{
CallMeFirst();
...
{
SomeClass ObjectA;
...
ObjectA.DoSomeStuff();
...
}
CallMeLast();
}
What I'm after is someway to ensure proper use of CallMeFirst and CallMeLast will happen even if someone just compiles/links to the library.
Thanks for the thoughts, Mark.
Chris Meech
I am Canadian. [heard in a local bar]
In theory there is no difference between theory and practice. In practice there is. [Yogi Berra]
|
|
|
|
|
hmmm I'm drawing a blank on enforcing the call before any constructor.
Here's what I was thinking previously - this example
uses a common base class instead of duplicating the
constructor/destructor code in every class...
void CallMeFirst()
{
}
void CallMeLast()
{
}
class CommonBaseClass
{
static int RefCount;
protected:
CommonBaseClass()
{
if (0 == RefCount)
CallMeFirst();
RefCount++;
}
~CommonBaseClass()
{
RefCount--;
if (0 == RefCount)
CallMeLast();
}
};
int CommonBaseClass::RefCount = 0;
class SomeClass : public CommonBaseClass
{
public:
SomeClass() {}
~SomeClass() {}
};
Close to your spec, but close only counts in horse shoes and hand grenades
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Can't see much wrong with that Mark, I wrote a story, you wrote the code, seems to be what I'd in mind too. I suppose it's single threaded. Can't see it break, except when components break, but that's an error handling issue.
Bram van Kampen
|
|
|
|
|
That looks like it might do the trick, Mark. Thanks a lot. I'll put together a test of this in the next couple of days and see how it goes. Really appreciate the help.
Chris Meech
I am Canadian. [heard in a local bar]
In theory there is no difference between theory and practice. In practice there is. [Yogi Berra]
|
|
|
|
|
Cool. Just a reminder (as Bram mentioned) - it's not
thread safe, although you can sync access to the ref count
if you need it thread safe.
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
In this Architecture, why not put the CallMeFirst and CallMeLast in a Base class. The Baseclass Constructor is always called before the object constructor, The Baseclass Destructor is always called after the object Destructor. The Info is scarce, hard to know what the OP wants to achieve. BTW Your code will only leak if DoSomeStuff breaks.
Bram van Kampen
|
|
|
|
|
Looks like we're thinking the same thing.
Chris wants the CallMeFirst() called before any
constructor though...
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for your additions to all of this Bram. I think what Mark put together will do the trick for me. You guys deserve 6's for your help.
Chris Meech
I am Canadian. [heard in a local bar]
In theory there is no difference between theory and practice. In practice there is. [Yogi Berra]
|
|
|
|
|
Your Info is schetcy, but I would use a static reference counter, starting at 0. CallMeFirst sets this to 1, Each Constructor first checks that it is not 0 to confirm that CallMeFirst has been Called. Each Destructor decrements the value, and checks if it is 1. If the Destructor finds the RefCount 1, it sets the RefCount to 0, and calls CallMeLast. A Good way of implementing this would be to use Multiple Inheritance, and also derrive each class from CRefCount.
Bram van Kampen
|
|
|
|
|
I am trying to get the information from this printf statement and place it in another one can anyone help.
I can't believe I can't see how to do this.
I want to take the information from "part8" in this statement:
float distance_between(struct place * a, struct place * b)
{
float ptrs here.....
math here.......
printf( "Result is: %9.2f \n", part8 );
}
Now I want to take my information from "part8" above and place it to "dist" in this statement :
float dist = distance_between( city_A[i], city_B[i] );
printf(" %s and %s is %d km\n",city_A[i]->name,
city_B[i]->name, dist);float dLat1 = a->lat;
can anyone help?
|
|
|
|
|
You just need to return the float value:
float distance_between(struct place * a, struct place * b)
{
float calculated_distance = 0.0;
float ptrs here.....
math here....... (calculate the distance)
return calculated_distance;
}
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
Thanks I realized after I sent the question all I had to do was
return part8; and it worked
Thank you for the reply though really appreciate it.
|
|
|
|