Solved

cast to int + return a LPSIZE

Posted on 2000-03-21
21
643 Views
Last Modified: 2008-02-20
There are 2 errors in the following function.  I am attempting to cast Text.length to an integer - how?  Also I want to correctly return a LPSIZE - how?

LPSIZE CNodeView1::TextExt(HDC dc, string Text)
{
  LPSIZE res;
  GetTextExtentPoint32(dc, Text.c_str(), (integer) Text.length, res);
  return res;
}

Note that this is the official definition of the GetTextExtentPoint32 function:

BOOL GetTextExtentPoint32(
  HDC hdc,          // handle to device context
  LPCTSTR lpString,  // pointer to text string
  int cbString,      // number of characters in string
  LPSIZE lpSize      // pointer to structure for string size
);

Finally - should I be passing in char * to make my life easier?

thanks
0
Comment
Question by:abulka
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 7
  • 3
  • +2
21 Comments
 
LVL 5

Expert Comment

by:Wyn
ID: 2643454
Try:

LPSIZE CNodeView1::TextExt(HDC dc, string Text)
{
  SIZE res;
  GetTextExtentPoint32(dc, Text.c_str(),Text.length, &res);
  return &res;
}

0
 
LVL 4

Expert Comment

by:wylliker
ID: 2643459
First, casting the length should be - (int)

Second, your variable - res - needs to be defined as:

SIZE res;

Your function call becomes ...

 GetTextExtentPoint32(dc, Text.c_str(), (int) Text.length, &res);
 

Give this a try.

0
 
LVL 5

Expert Comment

by:Wyn
ID: 2643465
or

SIZE size;
LPSIZE res;

LPSIZE CNodeView1::TextExt(HDC dc, string Text)
{
 GetTextExtentPoint32(dc, Text.c_str (),Text.length, &size);
  return &res;
}
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 5

Expert Comment

by:Wyn
ID: 2643471
Ignore last comment,I miswrite.
I mean:

private:
SIZE size;
LPSIZE res;
.............

LPSIZE CNodeView1::TextExt(HDC dc, string Text)
{
 GetTextExtentPoint32(dc, Text.c_str (),Text.length, &size);
  return &size;
}

...............

res=TextExt(...);
0
 

Author Comment

by:abulka
ID: 2643509
Oh yeah - I want to use the above function like this:

  long LineHeight = TextExt(mydc, "Aj").cy;
0
 
LVL 11

Accepted Solution

by:
alexo earned 50 total points
ID: 2643532
Wyn, don't EVER return an address of an automatic (local on the stack) variable!

You probably meant:

    SIZE CNodeView1::TextExt(HDC dc, string Text)
    {
        SIZE res;
        GetTextExtentPoint32(dc, Text.c_str(), (integer) Text.length, &res);
        return res;
    }
0
 

Author Comment

by:abulka
ID: 2643541
Wyn - looks like I actually don't need to declare
LPSIZE res;
since the function is not using it?

Also, when I typed in
LPSIZE CNodeView1::TextExt(HDC dc, string Text)
{
 GetTextExtentPoint32(dc, Text.c_str(), (int) Text.length, &size);
  return &size;
}

and compiled it I found that I had to includ an integer cast - cos I got a compile error.  Even so, I am still getting an error re that attempted cast!!

   CNodeView1.cpp(553) : error C2440: 'type cast' : cannot convert from 'unsigned int (__thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::*' to 'int'
        Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast

0
 

Author Comment

by:abulka
ID: 2643550
alexo - your code also fails on the line with the integer cast thus:
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2065: 'integer' : undeclared identifier
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2146: syntax error : missing ')' before identifier 'Text'
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2059: syntax error : ')'
0
 
LVL 5

Expert Comment

by:Wyn
ID: 2643574
->Wyn, don't EVER return an address of an automatic (local on the stack) variable!
==================================
Yes,I mean res and I rewrite one later just for this. But you'v got to admit at the very point the function returns,the value is still there on stack,although become tragedy later.
0
 
LVL 4

Expert Comment

by:wylliker
ID: 2643578
Yeah, we all missed on the (int) cast

should be (int) Text.length()
0
 
LVL 5

Expert Comment

by:Wyn
ID: 2643593
wylliker,I think in your first comment You already have the  code,(int)Text.length().You dont miss it:)
0
 
LVL 5

Expert Comment

by:Wyn
ID: 2643612
->looks like I actually don't need to declare
LPSIZE res;
since the function is not using it?
=================
Doesnt matter,just sample.
0
 
LVL 4

Expert Comment

by:wylliker
ID: 2643630
Wyn,

No, I did miss the () after length. As it is a member function - every example had incorrectly ...

(int) Text.length

instead of

 (int) Text.length()


I also forgot about the return value being a pointer to a SIZE structure.


 





0
 
LVL 5

Expert Comment

by:Wyn
ID: 2643676
O,:)
I even dont realize the () after the length until I read your last comment:-)

I concentrate myself to other parts of code.:0

Yes,it's a function:)

Sorry,wylliker .....:)
0
 
LVL 3

Expert Comment

by:LucHoltkamp
ID: 2643783
Why return a LPSIZE??????
It's more logical to return a SIZE! If you return a pointer, you need a variable to hold the value, as a member in you're class or as a static...
Not neccesairy, the way to go is returning a SIZE

SIZE CNodeView1::TextExt(HDC dc, string Text)
{
  SIZE res;
  GetTextExtentPoint32(dc, Text.c_str(),Text.length, &res);
  return res;
}
0
 
LVL 5

Expert Comment

by:Wyn
ID: 2644954
yup ,it's also my first way to go...The second I use &res.
0
 

Author Comment

by:abulka
ID: 2647107
alexo - your code also fails on the line with the integer cast thus:
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2065: 'integer' : undeclared identifier
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2146: syntax error : missing ')' before identifier 'Text'
D:\My Documents\aa Vc\ts1\CNodeView1.cpp(561) : error C2059: syntax error : ')'
0
 

Author Comment

by:abulka
ID: 2647279
Seems that
 
SIZE CNodeView1::TextExt(HDC dc, string Text)
{
  SIZE res;
  GetTextExtentPoint32(dc, Text.c_str(), (int) Text.length(), &res);
  return res;
}

compiles correctly.  I assume the
  return res
is not returning the actual local variable (which will disappear off the call stack as soon as the function exits), but a copy of res.  I hope so :-)


0
 

Author Comment

by:abulka
ID: 2647352
Seems that
 
SIZE CNodeView1::TextExt(HDC dc, string Text)
{
  SIZE res;
  GetTextExtentPoint32(dc, Text.c_str(), (int) Text.length(), &res);
  return res;
}

compiles correctly.  I assume the
  return res
is not returning the actual local variable (which will disappear off the call stack as soon as the function exits), but a copy of res.  I hope so :-)


0
 
LVL 11

Expert Comment

by:alexo
ID: 2648100
abulka, the (integer) cast was in the original code so I assumed it was correct (maybe a typedef to int?).  It should really be (int).

Returning a local variable is no problem since you return BY VALUE.  Tha is - a copy of the local variable.  On the other hand, returning a POINTER to a local variable (or a REFERENCE) to it usually makes your program go BOOM!
0
 

Author Comment

by:abulka
ID: 2651594
alexo seems to be the first one to get the closest to the answer.  And of course, the correct typecast is (int) rather than (integer)

SIZE CNodeView1::TextExt(HDC dc, string Text)
{
  SIZE res;
  GetTextExtentPoint32(dc, Text.c_str(), (int) Text.length(), &res);
  return res;
}
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

691 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question