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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.73
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
16.03.2009, 17:05     Невозможно преобразовать из char в const char #1
Добрый день!
В строке вызова функции 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";
         }
     }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
16.03.2009, 17:26     Невозможно преобразовать из char в const char #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"};        // массив указателей для фигур
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
16.03.2009, 17:28  [ТС]     Невозможно преобразовать из char в const char #3
Спасибо, работает!
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
08.10.2013, 16:32     Невозможно преобразовать из char в const char #4
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
VEINHORN
542 / 91 / 22
Регистрация: 16.12.2011
Сообщений: 317
08.10.2013, 17:13     Невозможно преобразовать из char в const char #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;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 17:19     Невозможно преобразовать из char в const char #6
Цитата Сообщение от Lodos Посмотреть сообщение
День добрый, столкнулся с той же проблемой в такой же задаче, как решить здесь написали, а может кто-нибудь объяснить почему я не могу передать char** в const char**?
Это как то связано с тем, что мы в функцию передаем массив указателей? С обычными указателями таких проблем по моему не возникает...
Хотелось бы разобраться в этом вопросе.
это const - "для защиты от себя". смысл в том, чтоб не забыл, что менять эначение по этому указателю нельзя. только явное преобразование типов требуется. тогда компилятор имеет ввиду, что ты "знаешь, что делаешь", и пропускает.
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
08.10.2013, 17:51     Невозможно преобразовать из char в const char #7
Спасибо, явное преобразование помогло. Меня смутило то, что в аналагичной ситуации, не для массива указателей, а для одиночного указателя, компилятор явного преобразования не требовал.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2013, 18:14     Невозможно преобразовать из char в const char #8
покажи эту аналогичную
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 12:15     Невозможно преобразовать из char в const char #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++]);
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 12:49     Невозможно преобразовать из char в const char #10
посмотри на, например,
C++
1
int number = 3;
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 14:37     Невозможно преобразовать из char в const char #11
Цитата Сообщение от novi4ok Посмотреть сообщение
в ф-и. аргумент в данном случае попадает "по значению", а не "по ссылке". т.е. эта тройка "едет" в ф-ю, там ты можешь с ней делать все что угодно, но после выхода из ф-ии значение переменной не изменится, останется тройкой. а когда ты передаешь адрес массива, ф-я работает с твоим массивом, а не с копией и имеет доступ ко всем элементам, и может их потенциально менять. в этом разница.
Согласен, но это вобщем то просто пример нескольких возможных вариантов передачи неконстантных данных в константные аргументы.

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

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

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

Добавлено через 19 минут
свой первый пост я хочу еще немного обдумать, возможно удастся коротко и ясно сформулировать (а может и нет).
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
28.10.2013, 15:42     Невозможно преобразовать из char в const char #13
Цитата Сообщение от novi4ok Посмотреть сообщение
если в списке аргументов стоит const, то это "гарантирует", что ф-я не изменит значение этого аргумента. поэтому туда можно передать как const, так и нет.
Это-то как раз интуитивно понятно.
Непонятно почему в случае если мы так же передаем массив указателей требуется явно переводить (const char **), хотя в более простых случаях это необязательно.
Собственно именно это меня и смутило (признаюсь, просто не подумал, что явное преобразование может помочь).
Думаю это у меня компилятор такой, более логичного объяснения я не вижу.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.10.2013, 18:16     Невозможно преобразовать из char в const char #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);
долго излагать, прочти здесь, и поймешь почему
Lodos
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 20
29.10.2013, 09:43     Невозможно преобразовать из char в const char #15
т.е. насколько я понимаю компилятор указывает, что при
Цитата Сообщение от novi4ok Посмотреть сообщение
void foo (const int **ppInt);
хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.10.2013, 11:54     Невозможно преобразовать из char в const char #16
Ваще то всё проще: межу const и не const просто запрещены некоторые неявные преобразования. Напиши перед параметром нудный const тип указателя в скобках.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 17:24     Невозможно преобразовать из char в const char
Еще ссылки по теме:

C++ Невозможно преобразовать параметр из int в const char
C++ Fopen: невозможно преобразовать параметр 1 из 'LPWSTR' в 'const char *'
C++ [Ошибка] invalid conversion from 'const char*' to 'char*' [-fpermissive]

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.10.2013, 17:24     Невозможно преобразовать из char в const char #17
Цитата Сообщение от Lodos Посмотреть сообщение
т.е. насколько я понимаю компилятор указывает, что при

хоть у нас и указана const int но с помощью указателей мы все равно можем поменять константные данные?
Собственно на эту возможность он и ругается?
именно так. поэтому компилятор и требует явное преобразование, иначе смысла в этом const вообще не было бы никакого.
Yandex
Объявления
29.10.2013, 17:24     Невозможно преобразовать из char в const char
Ответ Создать тему
Опции темы

Текущее время: 04:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru