Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
ProstoVassia
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 22
1

Переход с 10 на 17 Студию 2440 =: невозможно преобразовать "const char [2] в char*

02.01.2018, 19:53. Просмотров 1101. Ответов 10
Метки нет (Все метки)

Доброго Нового года!

Через пару дней сдавать контрольную работу, которую сделал ещё вначале осени, а тут совсем нелепая проблема. Раньше работая в VS 2010 программа успешно выполнялась, переустановил win10 и поставил VS2017. Теперь ранее исправная программа не идёт. Я логически не понимаю данной ошибки. Может ли кто пояснить в чём там дело.

Задание: Выполнить перевод чисел из одной системы счисления в другую и обратно. Убедиться в правильности результата.
777,774 (8->2)

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
int a, i;
char *s[] = { "000", "001", "010", "011", "100", "101", "110", "111" };
char st[] = { 7,7,7,',',7,7,4 };
char *x[50] = { 0 };
printf("Исходное число: 777,774\n");
for (i = 0; st[i] != '\0'; i++)
{
    if (st[i] == ',') {
        x[i] = ",";
        printf(",");
    }
    else {
        x[i] = s[st[i]];
        printf("%s", s[st[i]]);
    }
}
printf(" - двоичная система счисления\n");
for (i = 0; i<7; i++)
    for (a = 0; a <= 7; a++) {
        if (x[i] == ",") {
            printf(",");
            break;
        }
        if (x[i] == s[a]) {
            printf("%d", a);
            break;
        }
    }
printf(" - обратный перевод числа в восьмеричную систему\n");

Ошибка (активно) E0144 значение типа "const char *" нельзя использовать для инициализации сущности типа "char *" не присваивает массиву указателей "000" и т.д, таких 8 ошибок

Ошибка C2440 =: невозможно преобразовать "const char [2]" в "char *" x[i] = ",";

Ошибка C2440 =: невозможно преобразовать "const char *" в "char *" x[i] = s[st[i]];

Добавлено через 2 часа 28 минут
Не знаю как здесь редактировать. Напишу тут.
Переделал с двумерными массивами, но хотелось бы понять что здесь не так.
И char *x[50] = { 0 } не совсем понимаю как безразмерный массив указателей инициируется. Насколько бесконечные 50 строк с 0 будут?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2018, 19:53
Ответы с готовыми решениями:

Ошибка С2664: невозможно преобразовать параметр 1 из 'double' в 'const char *'
Ошибка C2664: невозможно преобразовать параметр 1 из 'double' в 'const char *' Visual 2008....

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char tracks = { &quot;ya ostavil svoe serdce v harvardskom...

Error C2440: =: невозможно преобразовать 'char (*)[150]' в 'char *'
Есть следующая задача. Написать программу, которая запрашивает количество родственников в семье, а...

"const char *" нельзя использовать для инициализации сущности типа "char"
/* /* Написать программу, которая показывает реальное время в выбранных городах мира. Программа...

Ошибка в коде: несовместимы типы операндов (char и const char)
Текст не содержит знаков препинания и набран одинаковым шрифтом. Составить программу определения...

10
freeelijah
53 / 53 / 23
Регистрация: 02.09.2009
Сообщений: 285
02.01.2018, 22:09 2
Здравствуйте. С Новым Годом!
Проверьте в свойствах проекта не установлен ли параметр компилятора /Zc:strictStrings.

P.S. И добавьте в строку инициализации st[] символ конца строки '\0'

Добавлено через 1 час 58 минут
Вернее, или добавьте в командную строку параметр /Zc:strictStrings-, или объявляйте x и s как const.
0
ProstoVassia
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 22
02.01.2018, 22:36  [ТС] 3
Сonst не объявить, т.к не смогу вносить изменения в массив указателей x, а он нужен. А командную строку что-то в панели инструментов не нашёл,
0
freeelijah
53 / 53 / 23
Регистрация: 02.09.2009
Сообщений: 285
02.01.2018, 23:02 4
Лучший ответ Сообщение было отмечено ProstoVassia как решение

Решение

Если объявите и указатели из x, и указатели из s как const, Ваш код сработает.
Дополнить параметры компиляции можно в "Свойства Проекта"->"C\C++"->"Командная строка"
1
02.01.2018, 23:02
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5084 / 2552 / 703
Регистрация: 18.10.2014
Сообщений: 4,432
02.01.2018, 23:12 5
Цитата Сообщение от ProstoVassia Посмотреть сообщение
Может ли кто пояснить в чём там дело.
Вы что-то выдумываете. Этот код компилируется без проблем в VS2017.

Ошибки, которые вы процитировали, характерны для языка С++ и не имеют никакого отношения к языку С. Поэтому возникает закономерный вопрос: на каком языке вы пишете свою программу? И если вы пишете ее на С, то почему вы пытаетесь компилировать ее как С++?
1
ProstoVassia
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 22
03.01.2018, 21:29  [ТС] 6
Хороший вопрос. Компилирую стандартным ctrl+f5 на vs2017, до этого создал чистый проект С++ и считал, что и обычное Си таким же образом должно компилироваться. Задание делал сам, но сам так для себя и не понял, когда я задаю массив указателей char *x[50] = { 0 } насколько большим он получается, как в этом случае выделяется память. Сделал, что называется "на шару", а только теперь когда выплыла ошибка задумался.
Если объявите и указатели из x, и указатели из s как const, Ваш код сработает.
В 2017 не работает, проверял несколько раз, даже сегодня ещё раз контрольный. Не работает так и всё
0
freeelijah
53 / 53 / 23
Регистрация: 02.09.2009
Сообщений: 285
03.01.2018, 22:48 7
Цитата Сообщение от freeelijah Посмотреть сообщение
Если объявите и указатели из x, и указатели из s как const, Ваш код сработает.
Я имел ввиду указатели НА const, если что:
C++
1
2
3
const char *s[] = { "000", "001", "010", "011", "100", "101", "110", "111" };
char st[] = { 7,7,7,',',7,7,4, '\0' };
const char *x[50] = {0};
Добавлено через 22 минуты
Цитата Сообщение от ProstoVassia Посмотреть сообщение
я задаю массив указателей char *x[50] = { 0 } насколько большим он получается, как в этом случае выделяется память
Выделяется 200 байт, ghи этом все указатели инициализируются значением NULL.

Тоже попробовал скомпилировать в VS 2017 - как сказал TheCalligrapher, все работает.
Пробовали с параметром /Zc:strictStrings- компилировать? Или установите компилятор в значение C (/TC)
0
ProstoVassia
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 22
04.01.2018, 01:00  [ТС] 8
Извиняюсь, с /Zc:strictStrings получилось. Нет ничего хуже незаконченных дел, аж уснуть не смог. Но всё равно не могу понять, если мы указываем указатель НА const, то как я меняю данные в *x[] в дальнейшем?
0
spvert
222 / 105 / 34
Регистрация: 25.11.2017
Сообщений: 377
Завершенные тесты: 1
04.01.2018, 02:49 9
char *x[50] = { 0 }; - это конечно круто, но не нужно, либо извращаться и делать { NULL, NULL, ... NULL } все 50 раз.
Изначально у вас массив указателей заполнен неопределенными значениями. Проще прогнать циклом с инициализацией в NULL.

На будущее - понятно, что вы четко знаете как выглядит исходное число. Но если вам его будут вводить, то вот тут программа работать перестанет. Пишите программу так, чтобы она всегда могла работать, без привязки к константному введенному числу. Это обезопасит и вас и тех, кто, в возможном будущем, будет вносить изменения в написанное вами.
0
freeelijah
53 / 53 / 23
Регистрация: 02.09.2009
Сообщений: 285
04.01.2018, 07:02 10
Лучший ответ Сообщение было отмечено ProstoVassia как решение

Решение

Цитата Сообщение от ProstoVassia Посмотреть сообщение
Но всё равно не могу понять, если мы указываем указатель НА const, то как я меняю данные в *x[] в дальнейшем?
Вы не меняете данные, а меняете то, на что указывает указатель x[i].
1
ProstoVassia
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 22
04.01.2018, 19:27  [ТС] 11
Вы не меняете данные, а меняете то, на что указывает указатель x[i].
Точно. Работаю же с указателями, значит присваиваю адрес. Спасибо.
0
04.01.2018, 19:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2018, 19:27

Const char нельзя присвоить сущность типа char
Здравствуйте! Начинаю изучать Си И вот у меня немного не получается написать свою первую...

C2664: fscanf: невозможно преобразовать параметр 1 из 'char [40]' в 'FILE *'
Организовываю файл данных со структурой, и выдает такую ошибку еrror C2664: fscanf: невозможно...

Error C2440: инициализация: невозможно преобразовать 'int' в 'char [100]'
#include &quot;stdafx.h&quot; #include &lt;string.h&gt; const int max=100; void strcat(char dest, char src) {...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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