|
You are using a format string; I am not. The following definitely doesn't have the same result:
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t me[] = L"George Jackson\n";
wcout << me << endl;
wcout << &me[0] << endl;
wcout << &me << endl;
wchar_t *me_ptr = me;
wcout << me_ptr << endl;
me_ptr = &me[0];
wcout << me_ptr << endl;
wchar_t (*me2_ptr)[16] = &me;
wcout << *me2_ptr << endl;
return 0;
}
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Well, you can find a lot of samples showing that there are differences, because indeed there are differences (I never stated the opposite). However there are some examples wherein array and &array have the same role, I have simply shown one of them.
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.
|
|
|
|
|
Yes, you have shown one example that can take several overloads. array and &array[0] are the standard ways of getting pointer and the address of an array. However, &array should not be used in the way you have demonstrated. Using &array with other types is interpreted as T (*)[ARRARY_SIZE] , explicitly, or T** , implicitly. The "&" of &array is not ignored by all compilers. If it is ignored, it is probably implicitly being casted (reinterpret_cast ) to a char* or wchar_t* ; thus, creating inefficient code.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks for your great reply, George!
Why T (*)[ARRARY_SIZE] is the same as T** implicitly?
regards,
George
|
|
|
|
|
In order to pass myself_ptr to the function print_myself . I have to dereference it to a pointer. Thus, myself_ptr acts like a pointer-to-a-pointer but it is really a pointer to an array pointer.
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
wchar_t (*myself_ptr)[15] = &myself;
print_myself(*myself_ptr);
return 0;
}
However, if you use just **myself_ptr as in wcout << **myself_ptr << endl; , the output would be just 'G' since **myself_ptr is dereferencing to the address of the first character and not the string, "George Jackson".
"We make a living by what we get, we make a life by what we give." --Winston Churchill
modified on Monday, December 10, 2007 10:56:33 PM
|
|
|
|
|
I'm a bit tired about your rather dogmatic approach (don't blame me about ).
First of all, you cannot pretend we're using C++ . The construct works as well using C language and its C++ behavior it is probably due to C inheritance.
On this grounds you can well understand that reinterpret_cast it is out-of-the-game.
Now let's make a little test.
The following C program:
int main(int argc, _TCHAR* argv[])
{
char a[]="hello world";
char * p = a;
char * q = &a[0];
char * r = &a;
printf("%x %x %x\n", p, q, r);
getchar();
}
compiles fine.
On execution the values of the p,q,r are the same (i.e. the address of the memory containing the string "hello world" ) and, if you look at assembly generated, you can find:
char * p = a;
00413392 lea eax,[ebp-14h]
00413395 mov dword ptr [ebp-20h],eax
char * q = &a[0];
00413398 lea eax,[ebp-14h]
0041339B mov dword ptr [ebp-2Ch],eax
char * r = &a;
0041339E lea eax,[ebp-14h]
004133A1 mov dword ptr [ebp-38h],eax
So your supposed inefficiency is out-of-the-game too.
Of course C++ compiler tends to be 'more strict' on type checking, but this has nothing to do with the core of the original note, that I can summarize as follows:
On a real pointer variable (e.g. char *p ) the address-of-operator & as the noticeable effect of really taking the address of the variable (address of p ). On the other hand, when & is applied to an array name (e.g. to the name a of the array char a[5]; ) it returns the same address that the array name itself returns.
In other words,
char a[5];
char *p;
p = a;
printf("p=%x, &p=%x\n);
printf("a=%x, &a=%x\n");
produces (on my computer, maybe you'll find something quite similar on yours) the following output:
p=12ff58 &p=12ff4c
a=12ff58 &a=12ff58
As I stated above, this is the main point. That said, there are differences between a and &a , differences extensively pointed out in this thread postings and related documentation.
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.
|
|
|
|
|
Was I being dogmatic?
My point is that &array seems to work okay with formatted output but may not work in other situations. &array in C++ is a different type than arrar and &array[0] , and behaves differently. Yes, they all return the same address; but, remember, C is no longer a true subset of C++ since there are now too many gotchas.
#include <iostream>
#include <string>
using namespace std;
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
print_myself(myself);
print_myself(&myself[0]);
print_myself(&myself);
return 0;
} Thus, it should not even be an alternative to array and &array[0] .
Thanks for the discussion.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
George L. Jackson wrote: Was I being dogmatic?
My point is that &array seems to work okay with formatted output but may not work in other situations. &array in C++ is a different type than arrar and &array[0], and behaves differently. Yes, they all return the same address; but, remember, C is no longer a true subset of C++ since there are now too many gotchas.
#include <iostream>
#include <string>
using namespace std;
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
print_myself(myself);
print_myself(&myself[0]);
// wchar_t (*myself_ptr)[15] = &myself;
print_myself(&myself); // Won't compile in C++ as is.
return 0;
}
Thus, it should not even be an alternative to array and &array[0].
I give up.
George L. Jackson wrote: Thanks for the discussion.
You're welcome, I was just kidding.
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.
|
|
|
|
|
CPallini wrote: ...this has nothing to do with the core of the original note...
None of what you and George are discussing has anything to do with the OP's syntax problem.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Sorry, we got caught up in expressing our point and the discussion whent amok!
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
No need to apologize, George. I was anything but offended.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
|
Do you have a bee in your bonnet? Italians must have some strange translation issues 'cause you've accused me of being both offensive and arrogant, both of which couldn't be further from reality.
CPallini wrote: But who cares?
I certainly don't. I was just curious as to why you and George insisted on beating a dead horse.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: Do you have a bee in your bonnet?
Maybe. Anyway, as you probably guessed I've completely missed your point (I already apoligized about, please see modified post).
DavidCrow wrote: 'cause you've accused me of being both offensive and arrogant, both of which couldn't be further from reality.
I'm happy about.
DavidCrow wrote: Italians must have some strange translation issues
This is at least unpolite (but my reply was really rude so I can't blame about). Anyway it wasn't a translation issue.
Have a nice day and sorry again for the misunderstanding.
DavidCrow wrote: I certainly don't. I was just curious as to why you and George insisted on beating a dead horse.
I think we're two obstinate guys.
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.
|
|
|
|
|
Hi DavidCrow,
It is also my coding style not to use &array.
It is code written by other people.
regards,
George
|
|
|
|
|
Hello everyone,
In the following statements,
<br />
template <class R, class T> class mem_fun_t : public unary_function <T*, R><br />
<br />
{<br />
<br />
R (T::*pmf)()<br />
...<br />
}<br />
1. I think pmf is a type of function pointer, the return type of the function is R and the function is a member function of type (class) T. Is my understanding correct?
2. If yes, what is the parameter list of the function? Empty parameter list?
3. I doubt whether it is useful to define a function pointer with empty parameter list -- too restricted.
thanks in advance,
George
|
|
|
|
|
Read documentation http://msdn2.microsoft.com/en-us/library/c8hzs937(VS.80).aspx[^] and you'll be able to answer all the questions yourself.
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.
|
|
|
|
|
Hi CPallini,
I do not think your reply has anything to do with my question. I am asking function pointer, not how to use unary_function itself.
regards,
George
|
|
|
|
|
Yeah, you're right. I missed the point. I struck my reply's content. Now, turning back to your question:
George_George wrote: 3. I doubt whether it is useful to define a function pointer with empty parameter list -- too restricted.
A lot of class methods usually take 0 arguments and their usefulness is, usually again, out of doubt.
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.
|
|
|
|
|
Thanks CPallini,
I want to confirm that, the declaration of variable pmf could be pointed to any member functions of class (type) T which returns type R and no input parameters? Right?
R (T::*pmf)()
regards,
George
|
|
|
|
|
Technically pmf is a member variable of class mem_fun_t whoose type is pointer to a method of class T, accepting zero arguments and returning an instance of class R .
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.
|
|
|
|
|
nevermind. i said a mistake
|
|
|
|
|
I think a day I'll become mad because of a George_George question.
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.
|
|
|
|
|
lol. keep it up, don't let me alone
|
|
|
|
|
I am sorry to make you mad, CPallini. Maybe my question is too hard?
regards,
George
|
|
|
|
|