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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день!
В строке вызова функции 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2009, 17:05
Ответы с готовыми решениями:

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

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

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

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

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

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

хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
именно так. поэтому компилятор и требует явное преобразование, иначе смысла в этом const вообще не было бы никакого.
1
29.10.2013, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2013, 17:24
Помогаю со студенческими работами здесь

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

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

Невозможно преобразовать 'const char [6]' в 'long'
Есть код: FILE *Protectdll; FILE *Coredll; FILE *Console; Protectdll =...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru