Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.73
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
#1

Невозможно преобразовать из char в const char - C++

16.03.2009, 17:05. Просмотров 5413. Ответов 16
Метки нет (Все метки)

Добрый день!
В строке вызова функции razdacha(Deck, Face, Suit); возникает ошибка invalid conversion from char** to const char**. Подскажите, пожалуйста, в чем проблема. Код ниже.Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void shuffle(int [][13]);                                                  // функция тасовки карт
void razdacha(const int [][13], const char *[], const char *[]); // функция раздачи карт
 
int main(int argc, char *argv[])
{
    int Deck[4][13] = {0};                                                // массив для раздачи карт
    char *Suit[4] = {"hearts", "diamonds", "spades", "clubs"}; // массив указателей для мастей
    char *Face[13] = {"ace", "deuce", "trey", "cater", "cinque", "sice", "seven", "eight",
                     "nine", "ten", "knave", "dame", "king"};        // массив указателей для фигур
    srand(time(NULL));
    shuffle(Deck);
    razdacha(Deck, Face, Suit);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
void shuffle(int deck[][13]) {
     int row, column;
     
     for (int card=1; card<= 52; card++) {
          row = rand()%4;
          column = rand()% 13;
     
          while(deck[row][column]!=0) {
                              row = rand()%4;
                              column = rand()% 13; 
                              }
          deck[row][column] = card;
          }
}          
void razdacha(const int deck[][13], const char *face[], const char *suit[]){
     for (int card = 1; card <=52; card++) {
         for (int row = 0; row <4; row++)
         for (int column = 0; column < 13; column++)
         
         if (deck[row][column]==card)
         cout << suit[row] << " " << face[column] << "\n";
         }
     }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2009, 17:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Невозможно преобразовать из char в const char (C++):

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Невозможно преобразовать параметр 1 из 'char' в 'const char *' - C++
Дана задача: Задана последовательность, состоящая только из символов ‘&gt;’, ‘&lt;’ и ‘-‘. Требуется найти количество стрел, которые спрятаны...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" - C++
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include &lt;iostream&gt; template&lt;typename T&gt; inline const T...

Невозможно преобразовать 'const char [6]' в 'long' - C++
Есть код: FILE *Protectdll; FILE *Coredll; FILE *Console; Protectdll = fopen(&quot;Protect.dll&quot;, &quot;rb&quot;); Coredll =...

Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" - C++
string s = &quot;555 44 55 66&quot;;//размер строки заранее неизвестен char* p = strtok(s.c_str(), ' '); не нравится такое...

Невозможно преобразовать параметр из int в const char - C++
Приветствую, помогите пожалуйста исправить следующую ошибку: printf: невозможно преобразовать параметр 1 из &quot;int&quot; в &quot;const char *&quot; Хотя...

16
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
16.03.2009, 17:26 #2
сделай так
C++
1
2
3
    const char *Suit[4] = {"hearts", "diamonds", "spades", "clubs"}; // массив указателей для мастей
    const char *Face[13] = {"ace", "deuce", "trey", "cater", "cinque", "sice", "seven", "eight",
        "nine", "ten", "knave", "dame", "king"};        // массив указателей для фигур
0
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
16.03.2009, 17:28  [ТС] #3
Спасибо, работает!
0
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
08.10.2013, 16:32 #4
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
0
VEINHORN
543 / 92 / 22
Регистрация: 16.12.2011
Сообщений: 317
08.10.2013, 17:13 #5
Lodos, почему не можете.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
 
void func(const char **string) {
    for(int i = 0; i < 2; i++)
        cout << string[i] << endl;
}
 
int main() {
    char *array[] = {
        "travis",
        "barker"
    };
 
    func((const char **)array);
    system("pause");
    return 0;
}
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 17:19 #6
Цитата Сообщение от Lodos Посмотреть сообщение
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
это const - "для защиты от себя". смысл в том, чтоб не забыл, что менять эначение по этому указателю нельзя. только явное преобразование типов требуется. тогда компилятор имеет ввиду, что ты "знаешь, что делаешь", и пропускает.
1
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
08.10.2013, 17:51 #7
Спасибо, явное преобразование помогло. Меня смутило то, что в аналагичной ситуации, не для массива указателей, а для одиночного указателя, компилятор явного преобразования не требовал.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 18:14 #8
покажи эту аналогичную
0
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 12:15 #9
Цитата Сообщение от novi4ok Посмотреть сообщение
покажи эту аналогичную
к примеру ни в одной функции явное преобразование не требуется:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<conio.h>
#include<stdio.h>
 
void functia1(const char, const int);
void functia2(const char *, const int);
void functia3(const char[]);
 
main()
{
   char simbol = 'A', string[] = "string";
   char *simbolPtr = &simbol;
   int number = 3;
 
   printf("Functia 1:\n");
   functia1(simbol, number);
   printf("\n");
   printf("Functia 2:\n");
   functia2(simbolPtr, number);
   printf("\n");
   printf("Functia 3:\n");
   functia3(string);
   printf("\n");
   
   _getch();
   return 0;
}
 
void functia1(const char sim, const int num)
{
   for(int i = 0; i <= num; i++)
      printf("%c ", sim);
}
 
void functia2(const char *sim, const int num)
{
   for(int i = 0; i <= num; i++)
      printf("%c ", *sim);
}
 
void functia3(const char array[])
{
   int i = 0;
   while(array[i] != '\0')
      printf("%c ", array[i++]);
}
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 12:49 #10
посмотри на, например,
C++
1
int number = 3;
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
0
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 14:37 #11
Цитата Сообщение от novi4ok Посмотреть сообщение
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
Согласен, но это вобщем то просто пример нескольких возможных вариантов передачи неконстантных данных в константные аргументы.

Что я хотел показать:
В ф-ю 1 передаются оба аргумента "по значению" - явное преобразование компилятор не затребовал.
В ф-ю 2 указатель char передается "по ссылке" а int "по значению", - явное преобразование тоже не нужно.
В ф-ю 3 передается массив, который в свою очередь, является указателем, и тут тоже не нужно явное преобразование.

А вот в примере, который выше:
Цитата Сообщение от VEINHORN Посмотреть сообщение
func((const char **)array);
, в котором передается массив ссылок, без явного преобразования компилятор выдавет ошибку (во всяком случае мой).

Собственно я и написал, что для случаев одинокого указателя (ф-я 2 и ф-я 3) мне не требовалось явно приводить к константным данным.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 15:38 #12
Цитата Сообщение от Lodos Посмотреть сообщение
Собственно я и написал, что для случаев одинокого указателя (ф-я 2 и ф-я 3) мне не требовалось явно приводить к константным данным.
если в списке аргументов стоит const, то это "гарантирует", что ф-я не изменит значение этого аргумента. поэтому туда можно передать как const, так и нет.

Добавлено через 19 минут
свой первый пост я хочу еще немного обдумать, возможно удастся коротко и ясно сформулировать (а может и нет).
0
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 15:42 #13
Цитата Сообщение от novi4ok Посмотреть сообщение
если в списке аргументов стоит const, то это "гарантирует", что ф-я не изменит значение этого аргумента. поэтому туда можно передать как const, так и нет.
Это-то как раз интуитивно понятно.
Непонятно почему в случае если мы так же передаем массив указателей требуется явно переводить (const char **), хотя в более простых случаях это необязательно.
Собственно именно это меня и смутило (признаюсь, просто не подумал, что явное преобразование может помочь).
Думаю это у меня компилятор такой, более логичного объяснения я не вижу.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 18:16 #14
объяснение все-таки имеется.

в случае
C++
1
void foo (const int i);
ф-я получит копию, и передавать туда можно const или нет. ты получишь ошибку компилятора, если внутри ф-ии попытаешься значение изменить.

теперь так:
C++
1
void foo (const int *pInt);
ф-я получает копию указателя, может его смело менять, но нельзя менять значение, на которое указатель показывает. т.е. const здесь - не указатель, а указываемое им значение. ты можешь, например, определить в ф-ии локальную переменную, присвоить указателю ее адрес (запросто), а изменить значение переменной можешь напрямую, но не через этот указатель. т.е. в этом случае const обозначает "этот указатель указывает на неизменяемое значение".

теперь наш интересный случай:
C++
1
void foo (const int **ppInt);
долго излагать, прочти здесь, и поймешь почему
0
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
29.10.2013, 09:43 #15
т.е. насколько я понимаю компилятор указывает, что при
Цитата Сообщение от novi4ok Посмотреть сообщение
void foo (const int **ppInt);
хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 09:43
Привет! Вот еще темы с ответами:

Невозможно преобразовать параметр 1 из 'const char [15]' в 'LPCWSTR' - C++
с сайта скачала прогу которая должна рисовать сферу, но при компилировании выходит ошибка:error C2664: auxInitWindowW: невозможно...

error C2664: strcmp: невозможно преобразовать параметр 1 из "char (*)[20]" в "const char *" - C++
for(int i = 0; i&lt; 5; i++) { wr_struc (list); if (strcmp(&amp;list.Sostav,osn_sostav)==0 &amp;&amp; strcmp(&amp;list.MestoVkomande,attack)==0...

Fopen: невозможно преобразовать параметр 1 из 'LPWSTR' в 'const char *' - C++
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include&lt;cstdio&gt; #include&lt;io.h&gt; int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE...

Невозможно преобразовать параметр 2 из "char" в "const char *" - C++
Ошибка strcpy: невозможно преобразовать параметр 2 из &quot;char&quot; в &quot;const char *&quot; //удаления из первой строки всех символов, встречающихся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
29.10.2013, 09:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru