Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Invalid conversion from 'char' tp 'char*'

Reply
Thread Tools

Invalid conversion from 'char' tp 'char*'

 
 
Tim Johansson
Guest
Posts: n/a
 
      04-07-2004
I'm new to C++, and tried to start making a script that will shuffle an
array. Can someone please tell me what's wrong?

#include <iostream.h>
#include <string.h>

int main () {
srand(time(0));
int array_length;
int count;
int randm;
char temp[30];
cout << "How many items in array? ";
cin >> array_length;
char items [30][array_length + 1];
for (count = 0; count <= array_length; count++) {
if (count != 0) {
cout << "\nWhat shall item " << count << " be?\n\t";
}
cin.getline (items[count], 30);
}
for (count = 0; count < array_length; count++) {
randm = rand() % array_length;
strcpy (temp[30], items[30][count]);
//ERROR
strcpy (items[30][count], items[30][randm]); //ERROR
strcpy (items[30][randm], temp[30]); //ERROR
}
return 0;
}


Can someone please tell me what is wrong? The errors I get are:
21: error: invalid conversion from 'char' to 'char*'
21: error: invalid conversion from 'char' to 'const char*'
22: error: invalid conversion from 'char' to 'char*'
22: error: invalid conversion from 'char' to 'const char*'
23: error: invalid conversion from 'char' to 'char*'
23: error: invalid conversion from 'char' to 'const char*'


 
Reply With Quote
 
 
 
 
Petec
Guest
Posts: n/a
 
      04-07-2004
Tim Johansson wrote:
> I'm new to C++, and tried to start making a script

^^^^^^
FYI, C++ programs are not "scripts", they're programs.

> that will shuffle
> an array. Can someone please tell me what's wrong?
>

<snip>

I'm not sure what was wrong (I couldn't understand it) but here's a little
shuffle program:

int main()
{
// a vector of strings to hold the items
std::vector<std::string> items;

// get items
std::cout << "Enter items, or blank to finish:" << std::endl;
for(;
{
std::string item;
std::getline(std::cin, item);
if(item == "")
break;
items.push_back(item);
}


std::cout << std::endl << "Shuffled items:" << std::endl;

// use the random_shuffle algorith in <algorithm> to shuffe the sequence
std::random_shuffle(items.begin(), items.end());

// copy the shuffled vector to std::cout
std::copy(items.begin(), items.end(),
std:stream_iterator<std::string>(std::cout, "\n"));
}

Also, I suggest you read the free & legal "Thinking in C++" book by Bruce
Eckel, availible at the author's website, www.mindview.net.

- Pete


 
Reply With Quote
 
 
 
 
Ragemare
Guest
Posts: n/a
 
      04-07-2004

"Tim Johansson" <(E-Mail Removed)> wrote in message
news:c51l09$2nosfd$(E-Mail Removed)-berlin.de...
> I'm new to C++, and tried to start making a script that will shuffle an
> array. Can someone please tell me what's wrong?
>
> #include <iostream.h>
> #include <string.h>
>
> int main () {
> srand(time(0));
> int array_length;
> int count;
> int randm;
> char temp[30];
> cout << "How many items in array? ";
> cin >> array_length;
> char items [30][array_length + 1];
> for (count = 0; count <= array_length; count++) {
> if (count != 0) {
> cout << "\nWhat shall item " << count << " be?\n\t";
> }
> cin.getline (items[count], 30);
> }
> for (count = 0; count < array_length; count++) {
> randm = rand() % array_length;
> strcpy (temp[30], items[30][count]);
> //ERROR
> strcpy (items[30][count], items[30][randm]); //ERROR
> strcpy (items[30][randm], temp[30]);

//ERROR
> }
> return 0;
> }
>
>
> Can someone please tell me what is wrong? The errors I get are:
> 21: error: invalid conversion from 'char' to 'char*'
> 21: error: invalid conversion from 'char' to 'const char*'
> 22: error: invalid conversion from 'char' to 'char*'
> 22: error: invalid conversion from 'char' to 'const char*'
> 23: error: invalid conversion from 'char' to 'char*'
> 23: error: invalid conversion from 'char' to 'const char*'
>
>


Not that I'm a expert but you appear to be trying to pass a single segment
of the array instead of all of the array, get rid of the '[30]'. Also I
don't think you can pass a two dimentional array to strcpy.


 
Reply With Quote
 
Kevin Goodsell
Guest
Posts: n/a
 
      04-07-2004
Tim Johansson wrote:

> I'm new to C++, and tried to start making a script that will shuffle an
> array. Can someone please tell me what's wrong?
>
> #include <iostream.h>


This is not a standard header. Standard C++ uses <iostream>. This
suggests that you are learning from a source that is either very
outdated, inaccurate, or (most likely) both.

> #include <string.h>


This is standard, but deprecated. <cstring> is the replacement.

>
> int main () {
> srand(time(0));


Where did srand() and time() come from? You haven't #included the
appropriate headers for these. Those headers are <cstdlib> and <ctime>,
respectively. Alternatively, the old deprecated versions are <stdlib.h>
and <time.h>.

If you use the first, non-deprecated versions, the functions will be in
namespace std::, and you need to account for that. So, for example, you
could do this:

std::srand(std::time(0));

Note also, that seeding the random number generator isn't always a good
idea. You are debugging your program -- consistency is good during this
phase. If you don't seed the random number generator (or seed it with
some constant value, like 7), then you'll get the same sequence of
numbers on each run, which makes debugging much easier.

> int array_length;
> int count;
> int randm;
> char temp[30];


Consider using std::strings instead of char arrays. They are safer, more
flexible, easier, and less error-prone.

Don't declare everything up front. Declare things where you use them. It
makes the code more clear, and someone reading the code does not need to
search as much for the declaration of an object.

> cout << "How many items in array? ";


cout, cin, etc. are all in namespace std::, and you need to account for
this somehow. So, for example, you could use this:

std::cout << "some output" << std::endl;
std::cin >> some_var;

> cin >> array_length;


What if this input operation fails? You should check for success. If it
fails, array_length will have an undefined value. Using it for anything
other than giving it a defined value would be bad.

> char items [30][array_length + 1];


This is illegal. Your compiler should reject it. If it doesn't, check
the documentation about how to invoke it in standards-compliant mode.

The problem is that array sizes must be compile-time constants.
array_length + 1 is not known at compile-time.

You should also prefer standard containers to arrays. std::vector is
almost a drop-in replacement for arrays, and is more flexible and
potentially safer.

It appears that a good replacement for this would be

std::vector<std::string> items(array_length + 1);

> for (count = 0; count <= array_length; count++) {


Not a major issue, but prefer pre-increment to post-increment when the
end result is the same. pre-inc may be faster, and is almost certainly
not slower, than post-inc. This probably makes no difference with
built-in types, but it's a good habit nonetheless.

> if (count != 0) {
> cout << "\nWhat shall item " << count << " be?\n\t";
> }
> cin.getline (items[count], 30);


This is wrong. What happens when 'count' is 500? The first index of
'items' only goes to 29, so you are potentially overflowing your array
bounds and invoking undefined behavior. Also, 30 may be more characters
than can fit in 'items[count]'. Basically, you reversed your indices in
the declaration (which, as I mentioned, was illegal anyway because one
of the sizes was not a compile-time constant).

After fixing all this, you still need special handling for when the line
is longer than your maximum string size.

If you used std::strings instead of char arrays, you could do this:

std::getline(items[count]);

Easier, safer, almost impossible to get wrong, not limited to some
arbitrary length.

> }
> for (count = 0; count < array_length; count++) {
> randm = rand() % array_length;


For various reasons, this is a poor way to limit rand()'s range. The
comp.lang.c FAQ has information on this. But for simple cases, it rarely
matters much.

> strcpy (temp[30], items[30][count]);


This is wrong. temp[30] doesn't exist, nor does
items[30][any_value_here]; Array bounds in C++ go from 0 to array_size-1.

Besides that, there is a type mismatch. strcpy() expects arguments of
type char* (const char* in the case of the source string), and you are
passing char. This is precisely what your error message says. You
probably wanted something like:

std::strcpy(temp, items[count]);

This assumes a few other changes in the code:

1) The std:: qualification assumes #include <cstring> instead of
#include <string.h>.

2) items[count] is only valid if you reverse the indices in the
declaration of items.

Better still, get rid of the arrays and use vectors and strings like
I've mentioned a few times:

std::string temp;
std::vector<std::string> items;

//...

// No need for special functions when dealing with
// std::string -- the normal operators work fine:
temp = vector[count];

> //ERROR
> strcpy (items[30][count], items[30][randm]); //ERROR
> strcpy (items[30][randm], temp[30]); //ERROR


Same basic problems here.

> }
> return 0;
> }
>


Finally, the standard library provide the function std::random_shuffle()
that does what you want.

>
> Can someone please tell me what is wrong? The errors I get are:
> 21: error: invalid conversion from 'char' to 'char*'
> 21: error: invalid conversion from 'char' to 'const char*'


The errors could hardly be more clear. The function you are calling
expects char* and const char* arguments, you passed char arguments.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
 
Reply With Quote
 
Kevin Goodsell
Guest
Posts: n/a
 
      04-07-2004
Ragemare wrote:

>
> Not that I'm a expert but you appear to be trying to pass a single segment
> of the array instead of all of the array, get rid of the '[30]'.


"Single element", not "single segment", but basically that's correct
(though there are several other problems).

> Also I
> don't think you can pass a two dimentional array to strcpy.
>


You can't pass any array (directly) to a function ever, regardless of
dimensions. Arrays aren't "first-class citizens" in C++. Any function
that appears to take (or return) an array actually takes (or returns) a
pointer.

A function may, however, take (or return) a class that contains an
array, or a reference to an array.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
 
Reply With Quote
 
Christopher Benson-Manica
Guest
Posts: n/a
 
      04-07-2004
Tim Johansson <(E-Mail Removed)> spoke thus:

> #include <iostream.h>


It's called <iostream> - the .h headers are deprecated.

> #include <string.h>


> int main () {
> srand(time(0));
> int array_length;
> int count;
> int randm;
> char temp[30];
> cout << "How many items in array? ";
> cin >> array_length;
> char items [30][array_length + 1];

^^^^^^^^^^^^
I assume this is legal in C++, but I'd love it if a real C++ person
stated something authoratative. As an aside, if you're making the
array array_length+1 items long, then array_length isn't really, is
it?

> for (count = 0; count <= array_length; count++) {
> if (count != 0) {
> cout << "\nWhat shall item " << count << " be?\n\t";
> }
> cin.getline (items[count], 30);

^^
Why not lose the magic number? Your code looks like C, so why not
keep the theme going and use

cin.getline( items[count], sizeof(items)/sizeof(*items) );

? That way if you change the number of items, you don't have to
remember to change the call to getline.

> }
> for (count = 0; count < array_length; count++) {
> randm = rand() % array_length;
> strcpy (temp[30], items[30][count]);


Here's the problem (well, besides that you're using C-style strings at
all): strcpy is prototyped as

char *strcpy( char *s, const char *t );

What is temp[30]? It's a char, of course. And what is
items[30][count]? It's a char, too. No wonder it doesn't compile,
eh?

And any particular reason you're ignoring the last string in items? If you
had made array_length the actual length of the array, you'd be fine (in this
snippet, at least), but you didn't.

> strcpy (items[30][count], items[30][randm]); //ERROR
> strcpy (items[30][randm], temp[30]); //ERROR
> }
> return 0;
> }


Either read a C book or learn how to use std::strings and std::vectors
- I recommend the latter.

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
 
Reply With Quote
 
Petec
Guest
Posts: n/a
 
      04-07-2004
Christopher Benson-Manica wrote:
> Tim Johansson <(E-Mail Removed)> spoke thus:
>

<snip>
>
>> cin >> array_length;
>> char items [30][array_length + 1];

> ^^^^^^^^^^^^
> I assume this is legal in C++, but I'd love it if a real C++ person
> stated something authoratative. <snip>


Nope, it's not legal. You'd either have to use arrays dynamically allocced
with new, or std::vectors or another appropriate standard container.

- Pete


 
Reply With Quote
 
Christopher Benson-Manica
Guest
Posts: n/a
 
      04-07-2004
Petec <(E-Mail Removed)> spoke thus:

> Nope, it's not legal. You'd either have to use arrays dynamically allocced
> with new, or std::vectors or another appropriate standard container.


Well, that's what *I* would have done, but I didn't want to say "NO!"
and then have to wipe more egg off my face than usual

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
 
Reply With Quote
 
Kevin Goodsell
Guest
Posts: n/a
 
      04-07-2004
Christopher Benson-Manica wrote:

> Tim Johansson <(E-Mail Removed)> spoke thus:
>
>
>>#include <iostream.h>

>
>
> It's called <iostream> - the .h headers are deprecated.
>


It's true that those headers which are part of the standard and which
end in .h are deprecated, but <iostream.h> is not even part of the
standard, therefore cannot be deprecated.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
 
Reply With Quote
 
Christopher Benson-Manica
Guest
Posts: n/a
 
      04-08-2004
Kevin Goodsell <(E-Mail Removed)> spoke thus:

> It's true that those headers which are part of the standard and which
> end in .h are deprecated, but <iostream.h> is not even part of the
> standard, therefore cannot be deprecated.


Clearly my answer was deprecated - sorry

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
invalid character in base-64 string and invalid postback or callba kevin ASP .Net 0 01-16-2008 09:39 PM
How do fix: "Wrong number of arguments" / "invalid propert assignment"/ "Invalid argument" Java Guy Javascript 1 10-15-2006 08:41 PM
How do fix: "Wrong number of arguments" / "invalid propert assignment"/ "Invalid argument" Java Guy Java 1 10-15-2006 08:31 PM
Invalid URI: There is an invalid sequence in the string. Error!! Patrick.O.Ige ASP .Net 1 07-02-2006 11:21 AM
invalid@invalid.org Hank Sniadoch Computer Information 1 08-20-2004 11:24 AM



Advertisments