Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/58: Рейтинг темы: голосов - 58, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26

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

16.03.2009, 17:05. Показов 12098. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2009, 17:05
Ответы с готовыми решениями:

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

Printf: невозможно преобразовать параметр 1 из 'char' в 'const char *'
Здравствуйте, подскажите как исправить? &quot;printf: невозможно преобразовать параметр 1 из 'char' в 'const char *'&quot; #include...

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

16
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
16.03.2009, 17:26
сделай так
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
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
16.03.2009, 17:28  [ТС]
Спасибо, работает!
0
0 / 0 / 1
Регистрация: 08.10.2013
Сообщений: 21
08.10.2013, 16:32
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
0
544 / 93 / 49
Регистрация: 16.12.2011
Сообщений: 317
08.10.2013, 17:13
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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 17:19
Цитата Сообщение от Lodos Посмотреть сообщение
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
это const - "для защиты от себя". смысл в том, чтоб не забыл, что менять эначение по этому указателю нельзя. только явное преобразование типов требуется. тогда компилятор имеет ввиду, что ты "знаешь, что делаешь", и пропускает.
1
0 / 0 / 1
Регистрация: 08.10.2013
Сообщений: 21
08.10.2013, 17:51
Спасибо, явное преобразование помогло. Меня смутило то, что в аналагичной ситуации, не для массива указателей, а для одиночного указателя, компилятор явного преобразования не требовал.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 18:14
покажи эту аналогичную
0
0 / 0 / 1
Регистрация: 08.10.2013
Сообщений: 21
28.10.2013, 12:15
Цитата Сообщение от 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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 12:49
посмотри на, например,
C++
1
int number = 3;
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
0
0 / 0 / 1
Регистрация: 08.10.2013
Сообщений: 21
28.10.2013, 14:37
Цитата Сообщение от novi4ok Посмотреть сообщение
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
Согласен, но это вобщем то просто пример нескольких возможных вариантов передачи неконстантных данных в константные аргументы.

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

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

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

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

в случае
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
0 / 0 / 1
Регистрация: 08.10.2013
Сообщений: 21
29.10.2013, 09:43
т.е. насколько я понимаю компилятор указывает, что при
Цитата Сообщение от novi4ok Посмотреть сообщение
void foo (const int **ppInt);
хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2013, 11:54
Ваще то всё проще: межу const и не const просто запрещены некоторые неявные преобразования. Напиши перед параметром нудный const тип указателя в скобках.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.10.2013, 17:24
Цитата Сообщение от Lodos Посмотреть сообщение
т.е. насколько я понимаю компилятор указывает, что при

хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
именно так. поэтому компилятор и требует явное преобразование, иначе смысла в этом const вообще не было бы никакого.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2013, 17:24
Помогаю со студенческими работами здесь

Невозможно преобразовать из const char в char*
#include &lt;string.h&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; class MyString { public: ...

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что &quot;char *concat(char *,...)&quot;: невозможно преобразовать аргумент 1 из &quot;const char &quot;...

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru