Talk:Generic swap: Difference between revisions
dc and reverse. |
|||
Line 93: | Line 93: | ||
y does the c version use char* and not void *? can it use anything? long* int* short* byte*etc? |
y does the c version use char* and not void *? can it use anything? long* int* short* byte*etc? |
||
:Because you can't operate on (void *), only refer to it. That said, a ''real'' implementation would cast to (int *) first (the most efficient machine word size), then finish any leftovers with a few less efficient (char *) swaps at the end. --[[User:IanOsgood|IanOsgood]] 18:50, 3 February 2008 (MST) |
:Because you can't operate on (void *), only refer to it. That said, a ''real'' implementation would cast to (int *) first (the most efficient machine word size), then finish any leftovers with a few less efficient (char *) swaps at the end. --[[User:IanOsgood|IanOsgood]] 18:50, 3 February 2008 (MST) |
||
== dc == |
|||
reverse is only available as a GNU extension (same with n, and comments (#) etc. - probably the other version should be kept too?) |
|||
[[User:Rahul|Rahul]] 20:46, 8 December 2008 (UTC) |
Revision as of 20:46, 8 December 2008
This task description seems to me a little too language-specific in its concepts.
The statement that "The generic routine is created with one or more generic formal parameters" could be read to exclude a Haskell function with an inferred, rather than explicit, type signature, or any language with an implicit universal type ("dynamically typed").
Broadly, the task description seems to me to overspecify a particular means of operation, rather than only "do this sort of thing in a way appropriate to the language".
To demonstrate the problem, I've written Haskell, E, and Perl examples. I'd like to see the intent of the task better described so that these examples are clearly correct or incorrect.
--Kevin Reid 18:13, 7 September 2007 (EDT)
I have adjusted the task definition. Please let me know if you have any more questions.
--Waldorf 18:11, 7 September 2007 (MDT)
Thanks; I think that's much better.
Since you ask, I was also wondering about how broadly to interpret "swap". For example, I wrote two examples which don't exchange values in mutable cells (as the Ada, Perl, and first E example do), but rather accept two values and produce them in the opposite order. (However, the Haskell version could easily be used in an imperatively-expressed program; e.g. modify swap
.)
--Kevin Reid 21:41, 7 September 2007 (EDT)
I do not want to limit the implementation. I am after the abstract functionality. I chose "swap" because it is conceptually simple. I am more interested in demonstrating genericity than the low level nature of swap.
--Waldorf 20:27, 7 September 2007 (MDT)
C++
Would the C++ example here assume that there is a copy constructor for T types? Would it be better to have "tmp = left" rather than "tmp(left)"? --mwn3d 00:08, 14 November 2007
- Well, in some circumstances (assigning a char to a CString in Windows MFC, for example), you have to use the explicit constructor, due to the way a class was defined. Granted, it would be a poor class implementation that required explicit use of its own copy constructor, but it's not impossible.
- In addition, I tried a couple small programs to test the problem:
#include <iostream> using namespace std; int main() { int a = 7; int b = int(a); cout << b << endl; }
- This outputs "7".
- I also tried creating a class with no defined copy constructor:
#include <iostream> using namespace std; class CNoCopy { public: int m_value; CNoCopy() { cout << "Constructor Called" << endl; } ~CNoCopy() { cout << "Destructor called" << endl; } void setValue( int newVal ) { m_value = newVal; } int getValue() { return m_value; } }; int main() { CNoCopy o1; o1.setValue( 7 ); CNoCopy o2 = CNoCopy( o1 ); cout << o2.getValue() << endl; }
- This outputs
Constructor Called 7 Destructor called Destructor called
- So the copy went ahead, without calling any explicitly-define constructor. For reference, I'm using G++ 4.1.3. In all, I think the implementation is fine. --Short Circuit 19:06, 14 November 2007 (MST)
boolga boolga boolga
y does the c version use char* and not void *? can it use anything? long* int* short* byte*etc?
- Because you can't operate on (void *), only refer to it. That said, a real implementation would cast to (int *) first (the most efficient machine word size), then finish any leftovers with a few less efficient (char *) swaps at the end. --IanOsgood 18:50, 3 February 2008 (MST)
dc
reverse is only available as a GNU extension (same with n, and comments (#) etc. - probably the other version should be kept too?) Rahul 20:46, 8 December 2008 (UTC)