473,718 Members | 2,016 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Invalid conversion from 'char' tp 'char*'

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*'
Jul 22 '05 #1
30 5055
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(st d::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_shu ffle(items.begi n(), items.end());

// copy the shuffled vector to std::cout
std::copy(items .begin(), items.end(),
std::ostream_it erator<std::str ing>(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
Jul 22 '05 #2
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(st d::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_shu ffle(items.begi n(), items.end());

// copy the shuffled vector to std::cout
std::copy(items .begin(), items.end(),
std::ostream_it erator<std::str ing>(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
Jul 22 '05 #3

"Tim Johansson" <sp**@gurka.s e> wrote in message
news:c5******** *****@ID-224346.news.uni-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.
Jul 22 '05 #4

"Tim Johansson" <sp**@gurka.s e> wrote in message
news:c5******** *****@ID-224346.news.uni-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.
Jul 22 '05 #5
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_len gth + 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(it ems[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(tem p, 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_shu ffle()
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.
Jul 22 '05 #6
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_len gth + 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(it ems[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(tem p, 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_shu ffle()
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.
Jul 22 '05 #7
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.
Jul 22 '05 #8
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.
Jul 22 '05 #9
Tim Johansson <sp**@gurka.s e> 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)cybers pace.org | don't, I need to know. Flames welcome.
Jul 22 '05 #10

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

Similar topics

30
685
by: Tim Johansson | last post by:
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;
5
4548
by: spoilsport | last post by:
Ive got to write a multi-function program and I'm plugging in the functions but I keep getting this error from line 40. Im new to this and cant find an answer anywhere. Sam #include <stdio.h> int main (void)
3
30891
by: philwozza | last post by:
Im trying to implement a THREAD class that encapsulates a posix thread. Here is an outline of my THREAD class. class THREAD { public: // returns 1 if thread sucessfully started int Start(void* = NULL); // other public functions
11
22081
by: Martin Jørgensen | last post by:
Hi, I'm using this alloc_mem-function: - - - - - - - - - - - - - - - - - - - - - - - - void *alloc_mem (size_t num_elems, size_t elem_size, char *filename, int line, size_t *total_mem) {
1
2217
by: enbulldog | last post by:
I am working on a program to "encrypt" a text file supplied by the user, and writing to another file also given by the user. I am very new to programming and am having trouble passing information from file to program and back to file. I am close, but I have comiler errors. Here is my code so far: #include <iostream> #include <cctype> #include <fstream> #include <iomanip> using namespace std; //Function: displayHeader
9
3170
by: Frederic Mayot | last post by:
Hi, Can someone give me an explanation why the following code produces a bug. I think it's related to the compiler and that the first line is not OK. I have no pb with gcc 3.4 but the bug appeared with gcc 4.1.1 A* p = ...; int l; (char*&)p += l; The right way is p = reinterpret_cast<A*>(reinterpret_cast<char*>(p) + l); Thanks
8
18578
by: AmmarN | last post by:
HI All; I am having a problem changing the value of an enum. I have a struct as shown below: typedef struct { union { long lV; volatile char c; } u1;
6
2352
by: Peter Lee | last post by:
what's the correct behaver about the following code ? ( C++ standard ) I got a very strange result.... class MyClass { public: MyClass(const char* p) { printf("ctor p=%s\n", p);
3
7158
by: fazulu deen | last post by:
Hi all, For the following code : file_ptr = fopen("pass_fail.txt", "a"); // error line 393 fdisplay(file_ptr, "Test Passed"); fclose(file_ptr);
0
8827
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
7985
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6652
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 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 a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5971
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4481
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
4740
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3180
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
2550
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2122
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.