Error invalid conversion from const char to int fpermissive

I've been working on a project with my arduino that display a knock knock joke on an LCD but I ran in to a problem while coding. This is what I have so far #include

I’ve been working on a project with my arduino that display a knock knock joke on an LCD but I ran in to a problem while coding.

This is what I have so far

#include<LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
int buttonPin = 13;
int menu = 0;
int joke(int line1, int line2){
  lcd.setCursor(0, 0); 
  lcd.print(line1);
  lcd.setCursor(0, 1);
  lcd.print(line2);
  lcd.setCursor(0, 0);
}

void setup(){
  pinMode(buttonPin, INPUT);
  lcd.begin(16,2);
}

void loop() {
  lcd.setCursor(15, 0);
  lcd.print(menu);
  int buttonValue = digitalRead(buttonPin);
  if(buttonValue = HIGH){
    menu = menu + 1;
  }
  if(menu == 0){
    joke("Knock!", "Knock!");
  } 

But when I run it I get the errors

LCD_HelloWorld.ino: In function ‘void loop()’:
LCD_HelloWorld.ino:28:28: error: invalid conversion from ‘const char*’ to 'int’          [-fpermissive]
LCD_HelloWorld.ino:7:5: error:   initializing argument 1 of ‘int joke(int, int)’ [-fpermissive]
LCD_HelloWorld.ino:28:28: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
LCD_HelloWorld.ino:7:5: error:   initializing argument 2 of ‘int joke(int, int)’    [-fpermissive]

After scouring the internet I’ve found nothing, so does any body have a solution?
BTW: I’m new to arduino and C/C++

Do you have this error with ArduinoJson 5.6 too?

Le 15 nov. 2016 08:58, «Dost Muhammad Shah» notifications@github.com a
écrit :

I am getting this error error: invalid conversion from ‘const char*’ to
‘int’ [-fpermissive] on

const char *user = root[«p»][«u»];

root is passed in to the function in this way void addAdmin(JsonObject
&root) {

Here is the code for the function

void addAdmin(JsonObject &root) {// un-subscribe from Default topic
// At the moment is not required as we will disconnect
// client.unsubscribe(defSubScribeTopic);

const char *regTopic = root[PARAMS]["r"];
setGeneratedTopic(regTopic, sizeOfGenTopic);

//Save admin number to EEPROM with null as terminating character
const char *user = root[PARAMS][U_UNAME];
// make sure we don't cross into another user memory
// write all the bytes there is no issue until we have enough space
eepu(user, users[0], maxChar4Number);
/*eeprom_update_byte(users[strlen(user)], 0);
eeprom_update_byte(&callPermission[0], 1);*/
writepgmstatus(PROGRAMMED);
setAdminAckSent(0);
//???  All stuff below is useless if we need to restart
// Get the new Subscribe and Publish topics
//getGeneratedTopic(subScribeTopic, false);
//client.unsubscribe(deaultt)
//s800.switchModem();
// reattemptConnection(CONNECT_MQTTT);
programmingSegmentOn;
wdt_reset();

}

and here is the complete error log

srcmain.cpp:132:44: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
const char *user = root[«p»][«u»];
^
In file included from libArduinoJson/ArduinoJson/Internals/JsonSerializer.ipp:11:0,
from libArduinoJson/ArduinoJson.hpp:16,
from libArduinoJson/ArduinoJson.h:8,
from srcmain.cpp:5:
libArduinoJson/ArduinoJson/Internals/../JsonArraySubscript.hpp:71:33: error: initializing argument 1 of ‘const ArduinoJson::JsonArraySubscript ArduinoJson::JsonVariantBase::operator const [with TImpl = ArduinoJson::JsonObjectSubscript<char []>]’ [-fpermissive]
inline const JsonArraySubscript JsonVariantBase::operator[](
^


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
#382, or mute the thread
https://github.com/notifications/unsubscribe-auth/AFNZoSWIlnxdCa9AP6dIKQqEBpwmn4Owks5q-WYXgaJpZM4KyOrg
.

Содержание

  1. Arduino.ru
  2. Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru
  3. forum.arduino.ru
  4. Ошибка преобразования из ‘const char*’ в ‘int’ в 32-й атмеге
  5. Arduino.ru
  6. Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru
  7. forum.arduino.ru
  8. Несовместимость типов данных: Error:invalid conversion from ‘int’ to ‘const char*’

Arduino.ru

Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru

forum.arduino.ru

Ошибка преобразования из ‘const char*’ в ‘int’ в 32-й атмеге

Скетч с LCD 2004
Выбираю батарейку, на экране нужные параметры.

Все компилируется, отлично работает на Уно.
Мне нужно спаять на плате одну штуку и решил взять завалящую 32А
Использую MightyCore

Но при компиляции говорит, что я инвалид и неправильно делаю преобразование:
«invalid conversion from ‘const char*’ to ‘int’»

Строки из библиотеки:

код как-то криво вставился, сорри, не вижу кнопку редактировать

Вставь в новом сообщении. Стыдно за столько лет не знать этого.

В функцию передаётся только указательна на массив char (точнее на первый элемент), по сути тебе нужно передавать в аргументе функции char*

И я не совсем понял суть переменной buf

В функцию передаётся только указательна на массив char (точнее на первый элемент), по сути тебе нужно передавать в аргументе функции char*

И я не совсем понял суть переменной buf

Спасибо, это пример из библиотеки, я лишь использую ее.

Можете написать строчку так, как видите ее Вы?

Спасибо, это пример из библиотеки, я лишь использую ее.

Можете написать строчку так, как видите ее Вы?

А нормально скопировать пример не судьба?

Неудачников нигде не любят.

Я не понимаю. Можете переформулировать?

Неудачник — это про себя?

А нормально скопировать пример не судьба?

Неудачников нигде не любят.

Я не понимаю. Можете переформулировать?

Неудачник — это про себя? Поскольку у меня с этим проблем нет.

А нормально скопировать пример не судьба?

Неудачников нигде не любят.

Я не понимаю. Можете переформулировать?

Неудачник — это про себя? Поскольку у меня с этим проблем нет.

В приведении есть ошибка или нет? Что изменилось со сменой контроллера?

А нормально скопировать пример не судьба?

Неудачников нигде не любят.

Спасибо. попробую, отпишусь.

Вероятно в понедельник.

Посмотрел, в функции getItemIndexByKey() вы возвращаете -1, а записываете возвращаемое значение в переменную типа uint8_t, и не проверяете на ошибку (-1)

Правильнее будет везде поменять на более соответствующее ситуации или int8_t или int16_t (в зависимости от количества пунктов), и проверять на ошибку.

Ну и я бы поменял

Зачем дефрагментировать кучу, если можно использовать локальную переменную. Строку 19 тогда нужно убрать.

SergeiL, во-ервых, спасибо большое за реальные строчки, а не филосовствования.

По скетчу. Пока не работает, занимаюсь. Меняю и сразу и частями. Сейчас хочу очистить код от всего кроме меню. Отпишусь к чему приду.

Проблема в том, что практически не имею опыта в программировании, и эти строки были взяты из примеров библиотеки. Поэтому я Вам киваю и с улыбкой заменяю 🙂

Сейчас все равно что-то найду. Так не оставлю.

Посмотрел, в функции getItemIndexByKey() вы возвращаете -1, а записываете возвращаемое значение в переменную типа uint8_t, и не проверяете на ошибку (-1)

Почему выбор плат:

ArduinoAVR -> Uno работает без проблем,

MightyCore -> Atmega32 с этой ошибкой

Zero-Botanik давйте ссылку на библиотеку, откуда вы скопировали эти строчки

Zero-Botanik давйте ссылку на библиотеку, откуда вы скопировали эти строчки

Спасибо что откликнулись

Код меню из примера: Menu_for_setting_params.ino

В него вставил функцию выбора, чтобы не вводить руками, а выбирать из списка, взял из файла: selectVal.ino

Оба файла по отдельности компилируются без ошибки, мой франкенштейн на 32-й дает ошибку

Zero-Botanik уже сам нашел

По-моему, этот автор VladimirTsibrov программирует чуть лучше вашего, используйте его библиотеку с острожностью

Почему выбор плат:

ArduinoAVR -> Uno работает без проблем,

MightyCore -> Atmega32 с этой ошибкой

Нет, не так. На Uno не работает без проблем. Только в стандартном ядре это будут не ошибки, а предупреждения (Warnings). Т.е. принятие решения оставлено на совести программиста.

Зайдите в меню File — Preferences и поменяйте настройку Compiler warnings с None хотя бы на Default. И Вы увидите все эти же сообщения.

А вот какого Х разработчики IDE по умолчанию отключают предупреждения — это уже другой вопрос.

Zero-Botanik уже сам нашел

По-моему, этот автор VladimirTsibrov программирует чуть лучше вашего, используйте его библиотеку с острожностью

Ну что есть в программирование с осторожностью? какой логический уровень у этого параметра? 🙂

Что-то надо делать. Мне понравилось его меню.

Разработчики правильно сделали что отключили.

Если бы я в самом начале это увидел, то бы и не стал заниматься. А сейчас хотя бы попробую что-то.

Нет, не так. На Uno не работает без проблем. Только в стандартном ядре это будут не ошибки, а предупреждения (Warnings). Т.е. принятие решения оставлено на совести программиста.

Зайдите в меню File — Preferences и поменяйте настройку Compiler warnings с None хотя бы на Default. И Вы увидите все эти же сообщения.

А вот какого Х разработчики IDE по умолчанию отключают предупреждения — это уже другой вопрос.

Ничего правильного. Без предупреждений Вы считаете что у Вас корректный код (раз он компилируется!), а работать он не будет. И что делать, как ошибку искать?

Именно так. Для новичка, на уровне мигания и хэллоу ничего не надо.
Кто на ступеньку поднимется, тому уже можно включать.
Это мое мнение. У Вас свое. Никаких проблем.

Скажите, сейчас в Visual Studio скопировал пример из библиотеки. Ее купить надо, чтобы компилировать? Хочу посмотреть что она скажет, Ардуино ИДЕ уже высказала свое мнение 🙂

Ничего правильного. Без предупреждений Вы считаете что у Вас корректный код (раз он компилируется!), а работать он не будет. И что делать, как ошибку искать?

Сведем к короткому вопросу:

Хочу посмотреть что она скажет, Ардуино ИДЕ уже высказала свое мнение 🙂

слушайте. вы немного идиот или как?

вместо того чтоб исправлять ошибку — вы будете пробовать разные среды программирования в надежде. что ошибка сама уйдет?

Именно так. Для новичка, на уровне мигания и хэллоу ничего не надо.
Кто на ступеньку поднимется, тому уже можно включать.
Это мое мнение. У Вас свое. Никаких проблем.

С мнением-то точно никаких проблем, проблема с кодом 🙂 А не с Вашим микроконтроллером, и не с компилятором. А Вы в это упорно не верите, теперь вот зачем-то в студию полезли. Вместо исправления ошибки.

Посмотрите на типы всех трёх параметров функции updateCaption в её описании и в Вашем вызове этой функции. Одинаково должно быть. Почему функция объявлена так как есть? Она судя по всему предназначалась для дописывания к некоей строке циферок. Поэтому и последний аргумент у неё число (int). А вы хотите передать туда Ваши названия батареек (строки). Так и сделайте такую же функцию, в которую будет передаваться не число, а строка.

Источник

Arduino.ru

Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru

forum.arduino.ru

Несовместимость типов данных: Error:invalid conversion from ‘int’ to ‘const char*’

In function ‘void loop()’:

error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]

Я запутался уже короче))) Понимаю, что несовместимость типов. Но как это поправить. Много его перепробовал(

Serial.Read() возвращает int, а не указатель на char

the first byte of incoming serial data available (or -1 if no data is available) — int

Я понимаю это. Я не знаю как сопоставить, чтобы не было этой ошибки.

int ch = Serial.read();

А уже дальше как то запихнуть ch в vw_send правильно его преобразовав.

При таком раскладе, весь вопрос сводится к строке:

Я много чего пробовал уже. Ни как не пойму как лучше сделать.

Но хз, понравится ли массив char функции Serial.println()

Или на основе такого:

А если ввести в строке, скажем 5 символов и надать энтер, то передаваться они будут посимвольно с паузами в секунду? Железа под рукой нет. Проверить не могу.
Serial.read() возвращает только один символ, и в msg строка не формируется, используется только нулевой символ.

так посылает целиком введенную строку

я новичек и мое замечание может быть ошибочным,

но выражу свое мнение,

error: invalid conversion from ‘int’ to ‘const char*’
в моём понимании фраза означает: что из переменной int не может перейти в переменную char

читал что приставка const указывает на то что значение не может изменяться в процессе работы программы,

мне кажеться надо либо убрать const либо заменить другой переменной.

я совсем не програмист и только начинаю изучать, но думаю стоит попробовать мой вариант

Всем спасибо, ребят) Все варианты хороши) На счет отправки символа по одному, для меня не так важно) Но все равно спасибо)

Такое впечатление, что никто не умеет программировать, 99% примеров некорректны. Одни примеры описывают указатель без выделения памяти по буфер, другие расходуют память, как будто там её море.
Не нравится? Объяснить ошибки?

нравится. моя бы послушал про ошибки ! 🙂 ( из-за одного — не нано )
«Век учись — всё равно дураком помрёшь !»

. в смысле — всем желаю здоровья !

Такое впечатление, что никто не умеет программировать, 99% примеров некорректны
. Я БЫ ПОПРОСИЛ . миня вычеркни — будет 98% .
:)-

Но хз, понравится ли массив char функции Serial.println()

Ошибка в строке 4 (проявится в строке 4), потому что msg — указатель и он не проинициализирован ничем. Значит писать будет куда попало. Считайте как русская рулетка, кому то повезет, а кому то нет.

Или на основе такого:

Ошибка в строке 16, нельзя создать массив с неизвестной на этапе компиляции длиной. Поэтому char buf[ message.length() ] просто не скомпилируется. В добавок в этом примере используется ДВА буфера памяти. Один в String, другой в buf. Накладно.

Конструкция char msg[message.length()] является расширением gcc, потому не соответствует стандартам.
Данный массив создается на стеке, как и положено, однако никаких проверок и т.п. не производится.
В общем можно пользоваться на свой страхи и риск. Я же буду знать и обходить стороной.

Здесь рассчет на то, что переменные инициализированы. Дело хозяйское, однако до определенного момента, когда это не сработает и придется искать баг долго, а такие баги найти не всегда легко.

Хотя бы в setup записать в msg[1] = ‘’ или при описании проинициализировать, типа char msg[] = » «;

Хотя данный вариант самый близкий и простой, можно считать его почти корректным.

kisoft

Как ни странно, но скетч компилится и работает.
Второй буфер нужен для преобразования типов String и string. 🙂
char buf — локальный и не статик, уничтожается сразу после выхода из else

Про тот в котором «Получилось»
Скажите, а зачем нужен массив msg[10], если работа все время идет только с нулевым элементом массива, остальные даже не затрагиваются, не заполняются и не используются?
Разницу в выполнении моего кода и «Получилось» оцените, когда зальете скетч в ардуино и введете, хотя бы пару символов в мониторе.

Все ж таки есть обиженные.
Про char msg[] = » «; спасибо, улыбнуло. Про скорость работы скетчей, так это нивелируется убиранием delay(1000). Или добавьте в свой delay, а то как то нечестно сравнивать.
Про char msg[ message.length() ], пожалуй посмотрю, кто же накосячил, я или оптимизатор.
А использовать два буфера в мк, где памяти мало — не есть хорошо. Да и зачем, если достаточно одного.

Привожу простой пример того, что я имел в виду. В примере вместо использования vw_send я вывожу в Serial, поскольку это не принципиально куда выводить, можно с тем же успехом вывести и в vw_send, при этом даже можно будет буфер сделать короче на один символ, т.е. не понадобится добавлять в конец буфера символ завершения строки ‘’. А длину взять непосредственно из message_buffer_index.

Пример он и есть пример, здесь нет обработки ошибок и т.п. Т.е. он далек от идеала. Но как пример использования одного буфера на две задачи (прием данных и отправка их в другую систему) вполне сгодится. В реальной жизни придется озаботиться еще и остатком данных в Serial и некоторыми другими вещами, но это уже совсем другая история.
Я писал раньше и сейчас повторю, что использование String не является ошибкой, но для данной задачи, на мой взгляд это избыточность. Хотя в примере serialEvent используется именно String. Впрочем задачу ТС мы не знаем, потому вопрос философский.

Да, я выше в своем сообщении добавил результат «разборок» с char msg[message.length()], остальной текст сообщения не трогал. Краткое резюме: gcc имеет такое расширения языка, но оно не является стандартным на данный момент, т.е. пользоваться можно, однако не стоит забывать, что стек не резиновый и такой массив в стеке займет неизвестно сколько места, что чревато сюрпризами.

UPD: По поводу String. Я посмотрел исходники, там ничего особенного, могу только порекомендовать использовать метод reserve для того, чтобы заранее выделить место в этой строке, чтобы оно в дальнейшем не перераспределялось при операциях типа ‘str += «message»;’. Для тех, кто использует STL, понятно, этот тип данных удобней, но использование в нем realloc для МК болезненно, что тоже понятно.

Принцип понятен, спасиб. У каждого метода есть свои достоинства и недостатки. И перименять из нужно исходя из конкретной задачи.

Принцип понятен, спасиб. У каждого метода есть свои достоинства и недостатки. И перименять из нужно исходя из конкретной задачи.

Это да, тут уже только опыт поможет, использовать то, что нужно в нужном месте. Ну и задача должна быть точно сформулирована, наче можно и из пушки по воробьям.

Итог. Код X-Dron данные не отправляет. Собрал по примеру kisoft. Все нормально работает)

А как правильно? Для меня указатели — отнюдь не оккультные арканы, но опыта таки мало. Поэтому и с трансиверами Нордика работаю на библиотеке MIRF, а не RF24. Просто в силу наличия в коде RF24 махинаций с памятью, которые мне непонятны.

А как правильно? Для меня указатели — отнюдь не оккультные арканы, но опыта таки мало. Поэтому и с трансиверами Нордика работаю на библиотеке MIRF, а не RF24. Просто в силу наличия в коде RF24 махинаций с памятью, которые мне непонятны.

Указатели, массивы — это детская болезнь любого человека, изучающего С (UPD: я лично по этим граблям тоже прогулялся 😉 ). Потому дальше только о массивах и указателях, именно в таком контексте. И да, речь про переменные в ОЗУ.

Можно начать с того, что любая переменная получет своё место в ОЗУ. Размер этого места зависит от размера этой переменной. Т.о. если есть массив uint16_t array[5];, то для него в ОЗУ выделяется места 10 байт. Как считается? Просто. Размер одного элемента умножить на количество элементов. В данном случае uint16_t — два байта и всего 5 элементов. 5 * 2 = 10.

Теперь указатели. Это тоже переменная. Её размер зависит от системы (МК). У нас это uint16_t, т.е. беззнаковое целое, размером два байта. Еще раз. Указатель — это в нашем контексте (!) всегда два байта. И это всё. Сам по себе он занимает место, а содержит он адрес какой то другой области памяти (как в ОЗУ, так и во флеше, как использовать).

Совместим массивы и указатели в следующем фрагменте:

куда попадут данные? Ответ простой, неизвестно. Теперь сразу другой пример:

куда попадут данные? Теперь это очевидно, что в array1

Еще пример, но он не очень хороший, только в учебных целях:

Здесь символы ‘F’, ‘I ‘, ‘ L ‘, ‘ L ‘, ‘ E ‘, ‘ R’ попадут в array1, а ‘O ‘, ‘U ‘, ‘T ‘ в array2. Однако использовать указатель для разных областей не очень хорошая практика. Можно нарваться на кучу проблем, но это совсем другая история.

Кстати, о практике, последние два примера можно на камне покрутить, вывести в Serial содержимое массивов до и после выполнения копирования.

Итак, мы теперь знаем, что указатель, это переменная, которая хранит адрес какой то области памяти и если её (переменную) не проинициализировать, то указатель будет указывать на неопределенное место.

Это в двух словах, если что непонятно, поясню.

Как такое возможно, что

Разве не должно быть знака *? Или это и есть та самая сакральная магия, типа присвоили указателю массив и он получил адрес первого байта? Или переменная массива, то есть array[], но без квадратных скобок — это и есть собственно указатель, то есть адрес первого байта? Я подозреваю второе, но пока непонятно.

Заодно ещё один вопрос, который давно не даёт мне покоя и тоже выглядит магией. Чем отличается uint8_t от byte (неподписанная 8-битная переменная, то бишь байт); чем отличается uint16_t от unsigned int (неподписанная 16-битная переменная, или int, два байта)? Не? Ну серьёзно, поджечь спичку или повысить её температуру до

3000°C? Вот ведь непростой выбор.

А что по вашему массив ? Массив цепочка последовательных данных начинающаяся с адреса. Поэтому компилятор понимает pointer=array, а вот в случае с array[0], такое не пройдет, тут надо pointer=*array[0] .

А uint8_t и uint16_t , я так думаю наследие от AVR си. Ну любят микропрограмеры 😉 именовать типы данных по количеству бит. А unsigned char, byte и unsigned int это исконно сишные типы. Кстати меня больше занимает что есть unsigned char, что в переводе означает беззнаковый символ :), то есть обычный символ может иметь знак . Чего в природе не встречается.

Да, сразу про опечатку в тексте brokly:

Т.е. это как бы одно и тоже, array1 и array2, но это на первый взгляд. Хотя, сначала об одинаковости. Что такое массив — это набор элементов, т.е. это элементы, расположенные в памяти последовательно, т.е. один за другим. Что такое указатель, это адрес элементов, расположенных в памяти последовательно. Одинаково? Ну да, это одно и то же, почти. Однако разница всё таки есть. Массив, как правило, это всё таки определенное количество элементов в памяти, а указатель, хранящий адрес этого массива (правильно, это адрес первого элемента массива), это указатель на элементы, но длина неизвестна. Это и есть основная разница. Разумеется существуют и массивы с динамической длиной, но это всего лишь указатели, а не массивы.

Для примера, у массива sizeof(array) — есть размер, а такой же sizeof для указателя не получить — размер неизвестен. Точнее сам указатель имеет размер и sizeof(pointer) выдаст, например, два (зависит от камня). В то же время sizeof(*pointer) будет далеко не равен sizeof(array). Можно легко попробовать.

Теперь о простых типах.

Если посмотреть определение, то:

Теперь вопрос исчерпан? Отнюдь. Мы видим маленькую особенность, а именно, тип byte описан в Arduino.h, а компилятор такого типа не имеет. И наоборот, тип uint8_t описан в компиляторе, но в arduino используется готовый тип. Это значит что? Что uint8_t можно использовать в gcc-avr и «ArduinoIDE», а byte — только в «ArduinoIDE».

Скажу больше, в Visual Studio также можно использовать uint8_t, потому что он там тоже определен в файле stdint.h

Чем хорошо или плохо использование одного и того же типа byte & uint8_t? Переносимость. Использование одного и того же исходника в разных средах. О чем я? byte можно использовать только в wiring (ArduinoIDE), а uint8_t можно использовать и в компиляторе и в ArduinoIDE (и в Visual Studio тоже).

Думаю не надо объяснять, что лучше?

Хотя всё это философия, особо никто не будет писать программу в ArduinoIDE и потом переносить её в другие среды. Но в тоже время, я иногда пишу программы в Visual Studio, потом переношу их в скетчи, в ArduinoIDE.

Разумеется никто не запрещает в Visual Studio определить typedef uint8_t byte; и использовать byte вместо uint8_t.

По-поводу знаковости и беззнаковости char. Эмм.. На самом деле в компиляторах есть ключи, которые позволяют считать тип char беззнаковым. А еще, если почитать Microsoft, то можно увидеть странную фразу, что тип char имеет размер примерно один байт. Странно? Может быть, однако не совсем. ASCII, Unicode и т.п.

Короче, не вдаваясь в подробности не парьтесь на счет знаковости и беззнаковости char, просто используйте тот тип, который соответствует ситуации, а именно. Если данные имеют значения от 0 до 200, то храним их в типе uint8_t или byte. Это логично, потому что в char эти значения не влезут (только не надо говорить, что влезут, с приведением типов, конечно влезут, но я не об этом, приведение типов — это совсем и не всегда хорошо, как кажется).

Например, есть данные, где значения от -5 до +5. В каком типе хранить? В char? Можно, конечно, однако это не символьная информация, значит выбираем тип int8_t, т.е. знаковое и минимальный размер — один байт.

Другой пример, символы ‘0’ — ‘9’, ‘A’ — ‘F’. Выбираем тип char, его достаточно для хранения таких данных.

Русские буквы. Не буду здесь писать про эту «проблему», потому что не хватит времени и буду это описывать до утра. Просто нужно помнить, что UTF-8 — это два байта на одну русскую буквы, а на латинскую — один байт. В то же время в 1251, что русские, что латинские — по одному байту на символ.

Если что то непонятно, лучше спрашивайте, может где и накосячил или не точно описал.

Источник

murphy1337

1 / 1 / 1

Регистрация: 30.05.2017

Сообщений: 63

1

27.09.2017, 16:10. Показов 4867. Ответов 3

Метки нет (Все метки)


Задание: ввести максимальное количество строк, затем вводить строки, пока не наберется 5 строк с символами пунктуации, или же не достигнет максимального количества строк. При компиляции выводит ошибку(в 26 строке):
[Error] invalid conversion from ‘char*’ to ‘int’ [-fpermissive]

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
46
47
48
#include<iostream>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#define max_symb 15
#define max_nujn_str 5
using namespace std;
int main()
{ int i, vse(0), max, k_pr_str(0);
  char pr_str[5][15];
  char m_strok[max_nujn_str][max_symb];
  char stroka[max_symb];
  cout << "Vvedite maximalnoe kol-vo strok: ";
  cin >> max;
  if(max < 1) cout << endl << "Nevernie razmernosti! ";
  else { 
      char **a = new char *[max];
      for(i = 0; i < max; i++)
         *(a+i) = new char [max_symb];
      cout << endl << "Vvedite stroki: ";
      for(i = 0; i <= max; i++) { 
         gets(stroka);
         vse++;
         stroka[max_symb - 1] = '';
         strcpy(*(a+i),stroka);
         if(ispunct(stroka)) {
            strcpy(pr_str[k_pr_str],stroka);
            k_pr_str++;
                             }
         if(k_pr_str == 5) break;
                                }
    
      if(k_pr_str == 0) cout << endl << "Ne bilo vvedeno strok so znakami punctuacii! ";
      else {
          cout << endl << "Stroki so znakami punctuacii: ";
          cout << endl;
          for(i = 0; i < k_pr_str; i++)
             puts(pr_str[i]);
           } 
      cout << endl << "Vse vvedennie stroki: ";
      cout << endl;
      for(i = 0; i < vse; i++)
         puts(*(a+i));
      delete [] a;
       }
getch();
return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



224 / 224 / 38

Регистрация: 17.12.2010

Сообщений: 713

27.09.2017, 17:51

2

murphy1337, компилятор более чем популярно объясняет в чем ошибка. Не поленитесь открыть спецификацию метода и посмотреть его аргументы и сравнить с тем, что вы туда передаете



1



0 / 0 / 0

Регистрация: 28.11.2021

Сообщений: 17

02.12.2021, 19:22

3

Не совсем понятно мне как это, если можете объяснить по подробнее как исправить ошибку, я только учусь по этому не могу понять что вы имели в виду «открыть спецификацию метода и посмотреть его аргументы и сравнить с тем, что вы туда передаете».



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

02.12.2021, 19:27

4

Один символ должен быть, а не строка.



0



Your code’s got three immediate problems.

The first one (and the one the compiler’s having a whine about) is that it can’t work out which constructor you want called. When you give it an int it can work out you want the first called. However when you give it a const char * it has no idea that you want the string constructor called. So if you want the string constructor called actually give it a string!

Mint b{ std::string{ "1234567" } };

is the sort of thing you need to use if you’ve got a modern compiler

Mint b( std::string( "1234567" ) );

if you haven’t.

Second problem is how you’re storing your digits. A better way than using a built in array is to use a std::vector. It’s dynamically resizable and, once sized, is usually as fast as a built in array.

The final problem is handling copying and assignment of your objects. Consider what happens when you do things like:

Mint a = 137;<br />
Mint b = a;<br />

Hopefully if you use a vector to store your digits this problem solves itself but if you try and manage memory yourself then it’s something you should consider.

Я здесь смущен. Почему я получаю эту ошибку?

Running /home/ubuntu/workspace/main.cpp
/home/ubuntu/workspace/main.cpp: In function ‘int main():
/home/ubuntu/workspace/main.cpp:22:19: error: invalid conversion from ‘const char* to ‘int [-fpermissive]
case "-" :
^
/home/ubuntu/workspace/main.cpp:22:19: error: ‘(int)((long int)"-") is not a constant expression
/home/ubuntu/workspace/main.cpp:31:19: error: invalid conversion from ‘const char* to ‘int [-fpermissive]
case "*" :
^
/home/ubuntu/workspace/main.cpp:31:19: error: ‘(int)((long int)"*") is not a constant expression
/home/ubuntu/workspace/main.cpp:40:19: error: invalid conversion from ‘const char* to ‘int [-fpermissive]
case "/" :
^
/home/ubuntu/workspace/main.cpp:40:19: error: ‘(int)((long int)"/") is not a constant expression
/home/ubuntu/workspace/main.cpp:50:14: error: no match for ‘operator>> (operand types are ‘std::ostream {aka std::basic_ostream<char>} and ‘const char [41])
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
/home/ubuntu/workspace/main.cpp:50:14: note: candidates are:
In file included from /usr/include/c++/4.8/string:53:0,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/ostream:38,
from /usr/include/c++/4.8/iostream:39,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&)
operator>>(basic_istream<_CharT, _Traits>& __in,
^
/usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<_CharT, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/istream:882:0,
from /usr/include/c++/4.8/iostream:40,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/bits/istream.tcc:955:5: note: template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)
operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
^
/usr/include/c++/4.8/bits/istream.tcc:955:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<_CharT, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/istream:882:0,
from /usr/include/c++/4.8/iostream:40,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/bits/istream.tcc:923:5: note: template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)
operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
^
/usr/include/c++/4.8/bits/istream.tcc:923:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<_CharT, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/istream:727:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)
operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
^
/usr/include/c++/4.8/istream:727:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<char, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/istream:732:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&)
operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
^
/usr/include/c++/4.8/istream:732:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<char, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/istream:774:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)
operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
^
/usr/include/c++/4.8/istream:774:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<char, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/istream:779:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*)
operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
^
/usr/include/c++/4.8/istream:779:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<char, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/ubuntu/workspace/main.cpp:1:
/usr/include/c++/4.8/istream:872:5: note: template<class _CharT, class _Traits, class _Tp> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&)
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
^
/usr/include/c++/4.8/istream:872:5: note: template argument deduction/substitution failed:
/home/ubuntu/workspace/main.cpp:50:17: note: ‘std::ostream {aka std::basic_ostream<char>} is not derived from ‘std::basic_istream<_CharT, _Traits>
cout >> "Want to continue? Enter Y or y OR N or n" << endl;
^

Для этого кода C++:

#include <iostream>

using namespace std;

int main(){
char option,continueCheck;
int a,b,res;
cout << "********** Welcome to the operation game ********* " <<endl;
do{
cout << "Please type (+,-,/,*) to add your numbers " <<endl;
cin >> option;
switch(option){
case '+' :
cout << "Please type in the first number" <<endl;
cin >> a;
cout << "Please type in the second number" <<endl;
cin >> b;
res = a+b;
printf("%d + %d = %d n" , a,b,res);
break;

case "-" :
cout << "Please type in the first number" <<endl;
cin >> a;
cout << "Please type in the second number" <<endl;
cin >> b;
res = a-b;
printf("%d + %d = %d n" , a,b,res);
break;

case "*" :
cout << "Please type in the first number" <<endl;
cin >> a;
cout << "Please type in the second number" <<endl;
cin >> b;
res = a*b;
printf("%d + %d = %d n" , a,b,res);
break;

case "/" :
cout << "Please type in the first number" <<endl;
cin >> a;
cout << "Please type in the second number" <<endl;
cin >> b;
res = a/b;
printf("%d + %d = %d n" , a,b,res);
break;
}

cout >> "Want to continue? Enter Y or y OR N or n" << endl;
cin >> continueCheck;

}while(continueCheck = 'y');
}

Я имею в виду, что я, очевидно, не превращаю char в int. Я даже не узнал, как это сделать. Как будто я здесь смущен. Думал ли он, что '+' — это int или что-то еще?

I’m trying to upload the code from here to work with an ESP8266. So I copy/pasted the code to the Arduino IDE and I get this error:

C:Program Files (x86)ArduinolibrariesWiFisrc/WiFi.h:79:9: error: initializing argument 1 of ‘int WiFiClass::begin(char*, const char*)’ [-fpermissive]

int begin(char* ssid, const char *passphrase);
^

exit status 1
invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

Can anyone help me with this?

per1234's user avatar

per1234

3,9062 gold badges20 silver badges40 bronze badges

asked Jun 21, 2017 at 19:50

Physther's user avatar

This begin() method expects a modifiable character array as its first argument. That’s what you should provide:

char ssid[]           = "YOUR_SSID";      // this is changed
const char* password  = "YOUR_PASSWORD";  // this is fine
[...]
WiFi.begin(ssid, password);

answered Jun 21, 2017 at 20:00

Edgar Bonet's user avatar

Edgar BonetEdgar Bonet

39.3k4 gold badges35 silver badges72 bronze badges

4

The location where you are calling the function begin, has as first parameter a parameter of type const char* instead of char* … remove the const from this argument type.

Probably you have something like

const char* s = ....

...

...begin(s, ...)

Change class s to

char* s = ...

answered Jun 21, 2017 at 19:52

Michel Keijzers's user avatar

Michel KeijzersMichel Keijzers

12.8k7 gold badges36 silver badges56 bronze badges

2

Понравилась статья? Поделить с друзьями:
  • Error invalid constructor arguments provided please verify that they are in abi encoded format
  • Error invalid combination of opcode and operands nasm
  • Error invalid client error description client id is incorrect
  • Error invalid class object
  • Error invalid captcha response