|
I'm not sure this is what you need, but the function below tells you how many pixels are taken up by a piece of text when it's displayed on a window using a given font. It's taken out of my CAMSWnd article here[^] on CP.
int CAMSWnd::GetTextExtent(CWnd* pWnd, const CString& strText, CFont* pFont )
{
ASSERT(IsWindow(pWnd->GetSafeHwnd()));
int nExtent = 0;
int nLen = strText.GetLength();
if (nLen)
{
TEXTMETRIC tm;
CDC* pDC = pWnd->GetDC();
CFont* pFontOld = pDC->SelectObject(pFont ? pFont : pWnd->GetFont());
pDC->GetTextMetrics(&tm);
CSize size = pDC->GetTextExtent(strText, nLen);
nExtent = size.cx + tm.tmAveCharWidth;
pDC->SelectObject(pFontOld);
pWnd->ReleaseDC(pDC);
}
return nExtent;
}
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
I need assistance with the following code for factorials. The program is outputting incorrect answers.
// DESCRIPTION
// This program is designed to read in non-negative integers n
// and to output the value of n! = n(n-1)(n-2)...(3)(2)(1).
// Note 0! is defined as 1.
// The program should continue to read in and process new
// values of n until:
//
// 1) The value of the previous n! exceeds MAXFACT
// or
// 2) A total of MAXCOUNT input values have been processed.
//
// WARNINGS
// This program has some syntax errors and some semantic errors
// User must not enter data less than 0 or large numbers
//
#include <iostream.h>
#include <stdlib.h>
using std::cout;
using std::cin;
using std::endl;
//Place any function prototypes here:
void factorial (int n);
const int MAXCOUNT = 4;
const int MAXFACT = 10000;
int main()
{
bool done = false; //i.e. not done yet
int n, counter=0;
unsigned int n_fact = 0;
while ((counter < MAXCOUNT) || (!done))
{
cout << "Enter a non-negative integer:";
cin >> n;
//compute n factorial and display the result
factorial(n);
cout << "The value of " << n << "! is " <<fact(n) <<="" endl;
="" if="" (n_fact=""> MAXFACT) //catch large factorial
done = true;
counter++; //count this iteration
}
//upon loop exit, one of the following must be true:
//counter reached MAXCOUNT or done (due to large factorial)
system("PAUSE");
return 0;
}
void factorial(int n)
{ //compute n! by multiplying together 1, 2, 3, ..., n
int counter;
unsigned int fact=0;
cout << "The value of n received is:" << n << endl;
cout << "At the start of the loop, fact is: " << fact << endl;
for (counter = n; counter > 0; counter--) {
fact *=counter;
return fact;
}
cout << "The calculated factorial is " << fact << "\n";
}
|
|
|
|
|
for (counter = n; counter > 0; counter--) {
fact *=counter;
return fact; // I think this is your problem
}
also if n > 12, then "unsigned int fact=0;" should realy be a double or something
|
|
|
|
|
The code makes it look like it would always return 0:
unsigned int fact=0;
should be
unsigned in fact=1;
|
|
|
|
|
The code does return 0 all of the time and I am having trouble grasping how to return the value obtained in the factorial function to the main function. Any advice?
|
|
|
|
|
I am a beginner and I am trying to write a program that takes a five digit inputed value and adds the digits together. I am trying to use a for loop to do this but I am having trouble. Please help.
|
|
|
|
|
Say more !
What are your problems ?,
Where are you stuck ?
Can you describe how you would do this in your own word ?
Can you formalise it into code ?
Show some code ...
Max.
|
|
|
|
|
So far I have:
int digit; //digit is the five digit number to be inputed by user
cin<
|
|
|
|
|
Is this what you are tring to do?
#include <stdio.h>
int main(int argc, char* argv[])
{
if(argc > 1)
{
double nval = 0;
for(size_t i = 0, count = strlen(argv[argc - 1]);
i < count;++i)
nval += argv[argc - 1][i] - '0';
printf("sum is : %f\n", nval);
}
return 0;
}
Is this some kind of homework or something?
|
|
|
|
|
How are you storing the five digits?
Are they in a char [] or an int []?
Michael
Fat bottomed girls
You make the rockin' world go round -- Queen
|
|
|
|
|
Post the code you have already begun to write and we will help you. If you have not already started to code, tell us more precisely how you would like to do it. You wno't learn anything if we throw the solution on this forum.
~RaGE();
|
|
|
|
|
Talk you your teacher or teacher's aid; you are clearly missing basic concepts that were discussed in class.
|
|
|
|
|
//I have now come up with the following but it still is not working properly:
int main()
{
int digit;
int sum;
int Total;
int num;
cout << "Enter a five digit number followed by enter: " ;
cin >> digit;
for (int i=4; i>=0; i--)
{
int p = pow(10,i);
num=digit/p;
digit=digit%p;
sum = sum + num;
}
cout << "The sum is " << sum << endl;
//Something is wrong with the sum = sum + num line. The previous lines work properly.
|
|
|
|
|
Key problem:
- Sum is not initialized to zero. (Set your warnings to level 4 if using VC7. If using VC6, you'll have to use pragma to ignore several warnings.)
Minor problems:
- Total is not used
- num should be a local variable.
Algorithm problem:
- Using pow() is inefficient. (Remember, it doesn't matter in which order you add the digits!)
|
|
|
|
|
So do you advise me putting cin >> digit into the for loop and then adding the digits to sum?
|
|
|
|
|
Only if you are allowed to have the user enter one digit at a time.
Otherwise you can process the digits from right to left:
while (digit)
{
sum += digit%10;
digit /= 10;
}
Of course this assumes: digit >= -99999 && digit <= 99999.
|
|
|
|
|
Hi, I have a problem (I think a big problem).
The language is C++. The operation sistem is Windows 2000.
If I create two application. In the first application fill a structure, open a file and send this information (pointer to file) at second application which fill the file. When the second application end your job, the control switch at first application which close the file.
The question is:
can I open a file in a application sending the pointer at second applicaton to fill the file.
|
|
|
|
|
No. Handles are unique to an application's memory space.
|
|
|
|
|
Hi,
Can any one help me out in sorting out the problem that is getting my brains out ...it's like Iam calling the CSocket object in the secondary thread and at this point I get an exception raised "Debug assertion failed" ..and I did the same thing with the raw socket handle and it worked absolutely perfect ..can ne one plz help cause I have to use the CSocket class and plz if there are any alternatives..
Thanx and Regards,
Junni
|
|
|
|
|
|
CSocket* connect()
{
pClientSocket = new CSocket;
pClientSocket->Create();
bConnect = pClientSocket->Connect(
m_strServerIPAddress.c_str(),
m_iServerPort
);
}
if( ! bConnect )
{
CString strTmp;
strTmp.Format("Error: Failed to connect to server (%s).",m_strServerIPAddress.c_str());
AfxMessageBox(strTmp);
return FALSE;
}
return pClientSocket;
}
//then I did
CSocket m_pClientSocket;
m_pClientSocket=new CSocket;
m_pClientSocket = Connect();
//then I used the m_pClientSocket->Receive() func that worked
//now I created a secondary thread using beginthreadex()
//then I called the m_pClientSocket->Receive()func in the secondary thread func threadproc()in a while loop ..it seems that evrytime I call the Receive method it raises the Debug assertion failed exception ..if I ignore the error I continues to execute the receive func of CSocket but after quite some delay..
Is there ant way out of this problem...
Thanx and Regards
Junni
|
|
|
|
|
As Rage pointed, you should provide more complete information about your problem. Which assertion failed? This is important info. Some pseudo-code would be useful for helping you too.
A common error on multithreaded CSocket code is made with CSocketServer; from MSDN:
"
If you want to handle this connection in a different thread, just passing the MFC object to the thread will not work correctly. To correctly set up everything for the connection to be handled in a different thread, the following steps are required:
1. Detach the socket handle from the CAsyncSocket object in the thread where the connection was accepted.
2. Pass the socket handle to the thread.
3. In the thread, attach this handle to a CAsyncSocket derived object.
"
I see dumb people
|
|
|
|
|
I vaguely remember comming across this problem before. I just opted to use socket handle as I was under presure to get the project finished on time. I never had the chance to go back and figure it out. If you figure it out I'd be grateful if you posted the answer here.
Regards,
Brian Dela
|
|
|
|
|
|
yes it is a worker thread and can u provide some info about the Message Pump and how to implement that..a snippet of code would do a lot..
Thanx
junni
|
|
|
|