473,382 Members | 1,784 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

ptr_fun & tolower confusion

I wanted convert a mixed case string to a lower case one. And I tried
following code:

std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));

Even though I's including cctype and algorithm, I's getting compiler (g
++ 3.3.6) error:

no matching function for call to `ptr_fun(<unknown type>)'

I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.

Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.

Regards,
~ Soumen
Jul 4 '08 #1
13 2966
Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:

std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));

Even though I's including cctype and algorithm, I's getting compiler (g
++ 3.3.6) error:

no matching function for call to `ptr_fun(<unknown type>)'

I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.

Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.

Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>

template < typename CharT >
class to_lower {

typedef std::ctype< CharT char_type;

std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;

public:

to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}

CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}

};
This is to be used with std::transform like so:

std::transform( mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(),
to_lower<char>() );

You could also initialize to_lower from a different locale.
Best

Kai-Uwe Bux
Jul 4 '08 #2
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));
Isn't there a syntax error - it should be a dot instead
of colons.

The following snippet works fine for me with gcc 3.4.6

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <cctype>

int main()
{
std::string str("MARY HAD A LITTLE LAMB");

std::transform(str.begin(), str.end(),
str.begin(),
std::ptr_fun(tolower));

std::copy (str.begin(), str.end(),
std::ostream_iterator<char>(std::cout));
return 0;
}
Jul 4 '08 #3
On Jul 4, 2:55*pm, Amal Pillai <amal.pil...@gmail.comwrote:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));

Isn't there a syntax error - it should be a dot instead
of colons.
Yes, there's a typo _here_ in the posting. Thanks for pointing. But in
actual code, it's a dot.
Even then I's getting the error. Only ::tolower resolved the error.
The following snippet works fine for me with gcc 3.4.6

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <cctype>

int main()
{
* * std::string str("MARY HAD A LITTLE LAMB");

* * std::transform(str.begin(), str.end(),
* * * * * * * * * *str.begin(),
* * * * * * * * * *std::ptr_fun(tolower));

* * std::copy (str.begin(), str.end(),
std::ostream_iterator<char>(std::cout));
* * return 0;

}

Jul 4 '08 #4
On Jul 4, 2:34*pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));
Even though I's including cctype and algorithm, I's getting compiler (g
++ 3.3.6) error:
*no matching function for call to `ptr_fun(<unknown type>)'
I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.
Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.

Slightly modified from the archive:

#include <tr1/memory>
#include <cstdlib>
#include <locale>

template < typename CharT >
class to_lower {

* typedef std::ctype< CharT char_type;

* std::tr1::shared_ptr< std::locale the_loc_ptr;
* char_type const * * * * * * * * * * the_type_ptr;

*public:

* to_lower ( std::locale const & r_loc = std::locale() )
* * : the_loc_ptr ( new std::locale ( r_loc ) )
* * , the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
* {}

* CharT operator() ( CharT chr ) const {
* * return ( the_type_ptr->tolower( chr ) );
* }

};

This is to be used with std::transform like so:

* std::transform( mixedCaseString.begin(), mixedCaseString::end(),
* * * * * * * * * mixedCaseString.begin(),
* * * * * * * * * to_lower<char>() );

You could also initialize to_lower from a different locale.

Best

Kai-Uwe Bux
Thanks. Could you please explain a bit about the functor class? I'm
not able to follow std::use_facet and std::locale part.

Regards,
~ Soumen
Jul 4 '08 #5
On Jul 4, 11:29*am, Soumen <soume...@gmail.comwrote:
On Jul 4, 2:34*pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:


Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));
Even though I's including cctype and algorithm, I's getting compiler (g
++ 3.3.6) error:
*no matching function for call to `ptr_fun(<unknown type>)'
I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.
Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
* typedef std::ctype< CharT char_type;
* std::tr1::shared_ptr< std::locale the_loc_ptr;
* char_type const * * * * * * * * * * the_type_ptr;
*public:
* to_lower ( std::locale const & r_loc = std::locale() )
* * : the_loc_ptr ( new std::locale ( r_loc ) )
* * , the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
* {}
* CharT operator() ( CharT chr ) const {
* * return ( the_type_ptr->tolower( chr ) );
* }
};
This is to be used with std::transform like so:
* std::transform( mixedCaseString.begin(), mixedCaseString::end(),
* * * * * * * * * mixedCaseString.begin(),
* * * * * * * * * to_lower<char>() );
You could also initialize to_lower from a different locale.
Best
Kai-Uwe Bux

Thanks. Could you please explain a bit about the functor class? I'm
not able to follow std::use_facet and std::locale part.

Regards,
~ Soumen- Hide quoted text -

- Show quoted text -
Man, you don't want to know how complicated
this issue is !
Go into Google groups and the comp.lang.c++
archives and search for "tolower kanze" for
enlightenment.
Jul 4 '08 #6
tragomaskhalos wrote:
On Jul 4, 11:29*am, Soumen <soume...@gmail.comwrote:
>On Jul 4, 2:34*pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:


Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));
Even though I's including cctype and algorithm, I's getting compiler
(g ++ 3.3.6) error:
no matching function for call to `ptr_fun(<unknown type>)'
I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.
Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
typedef std::ctype< CharT char_type;
std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * * * * * * * * * * the_type_ptr;
public:
to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}
CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}
};
This is to be used with std::transform like so:
std::transform( mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(),
to_lower<char>() );
You could also initialize to_lower from a different locale.
Best
Kai-Uwe Bux

Thanks. Could you please explain a bit about the functor class? I'm
not able to follow std::use_facet and std::locale part.

Regards,
~ Soumen- Hide quoted text -

- Show quoted text -

Man, you don't want to know how complicated
this issue is !
Go into Google groups and the comp.lang.c++
archives and search for "tolower kanze" for
enlightenment.
Right. The functor above is the outcome of an exchange on this newsgroup
that I had with James Kanze a while ago.

In a nutshell:

(a) The tolower from cctype does assume that its argument is positive. That
can cause trouble if char happens to be signed. (More precisely, this
tolower takes its argument as an int and the requirement is that the value
is either the value of the macro EOF or representable as an unsigned char.)

(b) The tolower functions offered through locales are templated upon the
character type and will handle negative arguments without running the risk
of undefined behavior.

(c) Extracting the char_type pointer from the locate via use_facet was
suggested by James Kanze to increase performance. Measurement confirmed
that he was right.

(d) The shared_ptr maneuver is necessary to keep the locale object alive in
case the functor gets copied from a temporary that goes out of scope
afterwards.
Best

Kai-Uwe Bux
Jul 4 '08 #7
On Jul 4, 4:31*pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
tragomaskhalos wrote:
On Jul 4, 11:29*am, Soumen <soume...@gmail.comwrote:
On Jul 4, 2:34*pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));
Even though I's including cctype and algorithm, I's getting compiler
(g ++ 3.3.6) error:
no matching function for call to `ptr_fun(<unknown type>)'
I could resolve this only by using "::tolower" instead of "tolower".
But then I started googling. And it looks to me
this is not safe. And got confused with many types of responses on
similar topic.
Can someone point me what's the **safe (portable), less-cumbersome**
way to change case of an std::string
using std::transform or any other algorithm? Using boost is also
acceptable (but I've not used boost much other
than using shared_ptr and polymorphic_cast) to me.
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
typedef std::ctype< CharT char_type;
std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * * * * * * * * * * the_type_ptr;
public:
to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}
CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}
};
This is to be used with std::transform like so:
std::transform( mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(),
to_lower<char>() );
You could also initialize to_lower from a different locale.
Best
Kai-Uwe Bux
Thanks. Could you please explain a bit about the functor class? I'm
not able to follow std::use_facet and std::locale part.
Regards,
~ Soumen- Hide quoted text -
- Show quoted text -
Man, you don't want to know how complicated
this issue is !
Go into Google groups and the comp.lang.c++
archives and search for "tolower kanze" for
enlightenment.

Right. The functor above is the outcome of an exchange on this newsgroup
that I had with James Kanze a while ago.

In a nutshell:

(a) The tolower from cctype does assume that its argument is positive. That
can cause trouble if char happens to be signed. (More precisely, this
tolower takes its argument as an int and the requirement is that the value
is either the value of the macro EOF or representable as an unsigned char..)

(b) The tolower functions offered through locales are templated upon the
character type and will handle negative arguments without running the risk
of undefined behavior.

(c) Extracting the char_type pointer from the locate via use_facet was
suggested by James Kanze to increase performance. Measurement confirmed
that he was right.

(d) The shared_ptr maneuver is necessary to keep the locale object alive in
case the functor gets copied from a temporary that goes out of scope
afterwards.

Best

Kai-Uwe Bux
Thanks for nice summary.
Jul 4 '08 #8
Kai-Uwe Bux <jk********@gmx.netwrote:
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>

template < typename CharT >
class to_lower {

typedef std::ctype< CharT char_type;

std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;

public:

to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}

CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}

};
This is to be used with std::transform like so:

std::transform( mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(),
to_lower<char>() );

You could also initialize to_lower from a different locale.
As I understand it, the above won't work in all cases. For example, in
German "STRASSE" should end up as "straße" if tolower is called on it,
but there is no way the above can accommodate that, even with locals.
Jul 4 '08 #9
On Jul 4, 11:34 am, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Soumen wrote:
Just curious, but...
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
typedef std::ctype< CharT char_type;
std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;
public:
to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
Why the new, and the smart pointer? I just use a locale member.
(If it's part of an actual application, I'll often forego
keeping a copy of the locale anyway---most of the applications I
work on don't play around with locales, so I'm generally sure
that the locale I'm using won't go away.)

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jul 4 '08 #10
James Kanze wrote:
On Jul 4, 11:34 am, Kai-Uwe Bux <jkherci...@gmx.netwrote:
>Soumen wrote:

Just curious, but...
>Slightly modified from the archive:
>#include <tr1/memory>
#include <cstdlib>
#include <locale>
>template < typename CharT >
class to_lower {
> typedef std::ctype< CharT char_type;
> std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;
> public:
> to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )

Why the new, and the smart pointer? I just use a locale member.
(If it's part of an actual application, I'll often forego
keeping a copy of the locale anyway---most of the applications I
work on don't play around with locales, so I'm generally sure
that the locale I'm using won't go away.)
No particular reason other than history of the code. It started out as an
internal class and was only used in placed where life-time of temporaries
guaranteed that the locale object would not go away. That class had a
locale pointer (or maybe a reference). So when the code was moved into a
different context where life-time guarantees became problematic, the
pointer got replaced by a smart pointer just to solve the life-time issue.
I guess it's mainly psychological: it was a pointer, it became a smart
pointer. That's all.

Probably, a locale member is better. One would not expect algorithms to copy
functors ruthlessly.
Best

Kai-Uwe Bux
Jul 4 '08 #11
On Jul 4, 2:34 am, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Soumen wrote:
I wanted convert a mixed case string to a lower case one. And I tried
following code:
std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixedCaseString.begin(), std::ptr_fun(tolower));

Slightly modified from the archive:

#include <tr1/memory>
#include <cstdlib>
#include <locale>

template < typename CharT >
class to_lower {

typedef std::ctype< CharT char_type;

std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;

public:

to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}

CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}

};
TR1's shared_ptr<class is not nearly as useful in this case as its
bind() routine. In fact, calling TR1's bind() would eliminate the
custom to_lower functor and its attendant complexity.

After all, lowercasing a C++ string seems like it should be a fairly
straightforward task - one that should require only a few lines of
code::

#include <iostream>
#include <string>
#include <algorithm>
#include <locale>

#include <tr1/functional>

using std::locale;
using std::tolower;
using std::tr1::bind;
using std::tr1::placeholders::_1;

int main()
{
std::string s("GrEg");

transform( s.begin(), s.end(), s.begin(),
bind( tolower<char>, _1, locale()));

std::cout << s << "\n";
}

Program Output:

greg
Jul 4 '08 #12
On Jul 4, 10:31 pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
James Kanze wrote:
On Jul 4, 11:34 am, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Soumen wrote:
Just curious, but...
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
typedef std::ctype< CharT char_type;
std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;
public:
to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
Why the new, and the smart pointer? I just use a locale member.
(If it's part of an actual application, I'll often forego
keeping a copy of the locale anyway---most of the applications I
work on don't play around with locales, so I'm generally sure
that the locale I'm using won't go away.)
No particular reason other than history of the code.
OK. The usual reason in real code, in sum.:-)
It started out as an internal class and was only used in
placed where life-time of temporaries guaranteed that the
locale object would not go away. That class had a locale
pointer (or maybe a reference). So when the code was moved
into a different context where life-time guarantees became
problematic, the pointer got replaced by a smart pointer just
to solve the life-time issue. I guess it's mainly
psychological: it was a pointer, it became a smart pointer.
That's all.
Probably, a locale member is better. One would not expect
algorithms to copy functors ruthlessly.
Interesting. My version had a similar history, except that in
the early versions, I didn't keep a pointer to the locale at
all; all I needed, after all, was the ctype. So when lifetime
of the locale (which controls the lifetime of the facet, for
those who might not be following us) became an issue, I created
a copy of the locale in the most convenient place; from what I
gather from the standard (although it probably shouldn't be used
as a design document), locales were designed to be copied, at a
more or less reasonable cost.

And, of course, I'm a very strong believer in the idea that if
you don't need arbitrary and explicit lifetime, you shouldn't be
using new.:-)

But I don't think it makes a real difference.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jul 5 '08 #13
On Jul 4, 10:52 pm, Greg Herlihy <gre...@mac.comwrote:
On Jul 4, 2:34 am, Kai-Uwe Bux <jkherci...@gmx.netwrote:
[...]
Slightly modified from the archive:
#include <tr1/memory>
#include <cstdlib>
#include <locale>
template < typename CharT >
class to_lower {
typedef std::ctype< CharT char_type;
std::tr1::shared_ptr< std::locale the_loc_ptr;
char_type const * the_type_ptr;
public:
to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr ( new std::locale ( r_loc ) )
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}
CharT operator() ( CharT chr ) const {
return ( the_type_ptr->tolower( chr ) );
}
};
TR1's shared_ptr<class is not nearly as useful in this case
as its bind() routine. In fact, calling TR1's bind() would
eliminate the custom to_lower functor and its attendant
complexity.
After all, lowercasing a C++ string seems like it should be a
fairly straightforward task - one that should require only a
few lines of code::
#include <iostream>
#include <string>
#include <algorithm>
#include <locale>
#include <tr1/functional>
using std::locale;
using std::tolower;
using std::tr1::bind;
using std::tr1::placeholders::_1;
int main()
{
std::string s("GrEg");
transform( s.begin(), s.end(), s.begin(),
bind( tolower<char>, _1, locale()));
std::cout << s << "\n";
}
That is, of course, the simplest solution. It hasn't been
available all that long, however, and most of us developed our
solution before bind was available. (The shared_ptr isn't
really necessary here, and even if it was, most of us had simple
implementations of shared_ptr long before it made it into TR1.)

And IMHO, there's nothing wrong with providing a general wrapped
tool (although it does lead to the mistaken belief that you can
generally use tranform for converting to lower case---in
practice, the mapping isn't one to one). And using the ctype
directly will probably be slightly faster (although I doubt that
that is an issue).

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jul 5 '08 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

13
by: David Rubin | last post by:
I get an error when I compile the following code: #include <algorithm> #include <cctype> #include <iostream> #include <string> using namespace std; string&
4
by: ShaneG | last post by:
We have ptr_fun to handle functions, mem_fun to handle member functions that will be called through a pointer, and mem_fun_ref to handle member functions that will be called through a reference. ...
4
by: Eric Lilja | last post by:
Hello, consider this program: #include <iostream> #include <algorithm> #include <string> #include <cctype> int main() { std::string s = "HEJ";
1
by: Bryan Olson | last post by:
Yesterday I embarrassed myself on sci.crypt with some incorrect C code and corresponding claims about the language. My source was Harbison and Steele (H&S), /C, A Reference Manual/ and I thought...
6
by: JSheble | last post by:
I realise .NET has all these great objects, specifically strings, but is it really necessary to create a string variable (object) just to compare two string values? For example, I'm looking at...
12
by: Michael Maes | last post by:
Hello, I have a BaseClass and many Classes which all inherit (directly) from the BaseClass. One of the functions in the BaseClass is to (de)serialize the (inherited) Class to/from disk. ...
2
by: Pippo | last post by:
I've created a c# dll with some classes and i've included some icons that i can see with ILDASM like namespace.iconfile.ico I re-use this dll (dll reference) and relative classes in many vb...
5
by: Fei Liu | last post by:
Hello, I have a situation where I need to design a library for multi-thread application, each thread does some work in a client supplied std::ptr_fun(free_function) or a functor. Now since it's...
19
by: Taras_96 | last post by:
Hi all, A poster at http://bytes.com/forum/thread60652.html implies that using strtoupper in transform doesn't work because ctype.h may define strtoupper as a macro: "The problem is that most...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.