|
There are notable differences between:
Haroon Sarwar wrote: char test[] = "Hello";
Here test is a character array(i.e. a const pointer to a memory area containing six characters -remember the '\0' string terminator-), initialized with the string literal "Hello" .
Haroon Sarwar wrote: char* test = "Hello";
Here test is a pointer to the string literal "Hello" , that is a read-only memory area.
See the following sample code:
char test1[] = "Hello";
char * test2 = "Hello";
test1[2]='p';
test2 = test1;
test2[2]='p';
Hope that helps
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
If you do these within a function they will both get allocated on the Stack, one array and one pointer. The actual "Hello " text in each case will end up as static data within the executable image. char text[] = "Hello"; will give you an on stack copy of this data at runtime. const char* test = "Hello"; will give you a pointer to the string stored in the image memory. char* test = "Hello"; will almost certainly be the same.
If you do these at file scope, i.e. in a .c or .cpp file but not in a function then the "Hello" text is still stored in the image and in this case so is test[] or test. With a reasonable optimising compiler with string merging char* test; will probably end up pointing to the same memory refered to by char test[] which will be the one and only original "Hello" text in the loaded image.
Have a look in the debugger at runtime and see what the address values are in each case. You'll soon spot the pointers to stack memory as opposed to pointers into the loaded image, the ranges will be quite different.
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
See here.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
How can i get the result ?
i have a CListCtrl m_list
--------------------------
|Col1 | Col2| Col3 |
--------------------------
| 10 | 2 | 1 |
--------------------------
| 10 | 2 | 1 |
--------------------------
all i want is to get the result from col3 = 2
m_list.GetItem(...);
s1.Format(....);
AfxMessageBox(s1); // =2 from (Col3)
How Can i get the result?(from Col3);
Bravoone
|
|
|
|
|
Bravoone_2006 wrote: How Can i get the result?(from Col3);
as follows
CString csText = GetItemText(1,2);
AfxMessageBox(s1);
nave
|
|
|
|
|
no you dont understand i need row1+row2 = s1(or can be more than 2 rows)
How?
Bravoone
|
|
|
|
|
you mean you want to get the sum of integers in all columns of row1 and row2?
nave
|
|
|
|
|
|
put it in a for loop
int nsum = 0;<br />
for( int nRow = 0; nRow < m_lis.GetItemCount();nRow++)<br />
{<br />
for( int nColumn = 0; nColumn < 3;nColumn ++)<br />
{<br />
CString csText = GetItemText(nRow ,nColumn );<br />
nsum += _atoi( csText);<br />
}<br />
}
nave
|
|
|
|
|
This is my problem is not working !why?
CString csText = m_list1.GetItemText(nRow ,nColumn );
nsum += atoi( csText);
m_sum.SetWindowText(csText);
Bravoone
|
|
|
|
|
Why is not working ?
int nsum = 0;
for( int nRow = 0; nRow < m_list1.GetItemCount();nRow++)
{
for( int nColumn = 0; nColumn < 2;nColumn++)
{
CString csText = m_list1.GetItemText(nRow ,nColumn );
nsum += atoi( csText);
m_sum.SetWindowText(csText);
}
}
Bravoone
|
|
|
|
|
Bravoone_2006 wrote: int nsum = 0;
Bravoone_2006 wrote: m_sum.SetWindowText(csText);
Where you want to show csText?
|
|
|
|
|
int nsum = 0;
for( int nRow = 0; nRow < m_list1.GetItemCount();nRow++)
{
for( int nColumn = 0; nColumn < 2;nColumn++)
{
CString csText = m_list1.GetItemText(nRow ,nColumn );
nsum += atoi( csText);
m_sum.SetWindowText(csText);
}
}
I would do it like this:
int CMyDialogBox::SumColumn(CListCtrl* pList, int nColumn)
{
int nSum = 0;
int nRows = pList->GetItemCount();
CString csText = "";
if (nRows > 0)
{
for (int nRow = 0; nRow < nRows; nRow++)
{
csText = pList->GetItemText(nRow ,nColumn );
if (!csText.IsEmpty())
{
CString sNumbers = "0123456789";
bool bIsValid = true;
for (int i = 0; i < csText.GetLength(); i++)
{
bIsValid = (sNumbers.Find(csText.GetAt(i) < 0);
if (!bIsValid)
{
break;
}
}
if (bIsValid)
{
nSum += atoi( csText);
}
}
}
}
}
void CMyDialog::SomeFunction()
{
int nResult = SumColumn(&m_list1, 1);
CString csText;
csText.Format("%d", nSum);
m_sum.SetWindowText(csText);
}
The code above allows you to debug easily, but at the same time, doesn't make any assumptions about the data you're trying to process. Your code blindly assumes that the data is in an expected format. For all you know, the selected column might contain alphabetic text instead of numbers. MY code performs the mundane (yet important) sanity checks before doing anything with the data.
Caveat: I typed all that in off the top of my head so there might be small compile issues, but certainly nothing you can't handle. On the other hand, if you can't handle it, maybe you should find another line of work.
NOTE: I didn't want to use the atoi function to determine the validity of the converted string because if it's not a number, it returns 0, which IS a number. It's also a VALID number, so you can't just assume that the return value is what you expect it to be. That's why I included code to check each character one at a time before trying to convert it to a numeric value.
-- modified at 9:21 Wednesday 30th May, 2007
-- modified at 9:36 Wednesday 30th May, 2007
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
John Simmons / outlaw programmer wrote: NOTE: I didn't want to use the atoi function to determine the validity of the converted string because if it's not a number, it returns 0, which IS a number. It's also a VALID number, so you can't just assume that the return value is what you expect it to be. That's why I included code to check each character one at a time before trying to convert it to a numeric value.
So why not just use strtol() ?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: So why not just use strtol()?
Because like atoi , it returns ZERO if the string cannot be converted.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
True, but unlike atoi() , it has an argument that tells if the entire string was looked at or not.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
There's a bunch of different ways to get to the same point. He used atoi , so I did to. The point really isn't worth arguing, IMHO, but y'all go right ahead and talk amongst yourselves.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Your answer was perfect.
|
|
|
|
|
Bravoone_2006 wrote: m_sum.SetWindowText(csText);
the SetWindowText() must be used after all the loop isn't?
int nsum = 0;<br />
for( int nRow = 0; nRow < m_list1.GetItemCount();nRow++)<br />
{<br />
for( int nColumn = 0; nColumn < 2;nColumn++)<br />
{<br />
CString csText = m_list1.GetItemText(nRow ,nColumn );<br />
nsum += atoi( csText);<br />
}<br />
}<br />
TCHAR tcsum[50]<br />
_itoa( nsum, tcsum, 10 );<br />
m_sum.SetWindowText(tcsum);
nave
|
|
|
|
|
How can i use a non staticmember function for callback purpose
thanks
|
|
|
|
|
See Here[^]
Description of article:
The purpose of this article is to present a method whereby both static and non-static class member functions, as well as non-member functions can be used as callback functions. Type-safety is important in this implementation, and some features are left out in order to retain this.
Regards,
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3r
My Blog: ^_^
|
|
|
|
|
You can't because static member functions and standard member functions don't have the same prototype: for the latter, an implicit this parameter is passed.
The way to solve this problem is that in general, most callback functions allow you to pass some data (in general a pointer). Pass the pointer to your class instance (this) along the address of the static function that will be used for callback. In the callback function, you can then cast back the pointer to your class and call a member function from it (it should be public).
|
|
|
|
|
Actually i need a WindowProc as a member function
|
|
|
|
|
Read this...[^]
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3r
My Blog: ^_^
|
|
|
|
|
hi
How can i create an activeX control using an existing one
Arun
|
|
|
|