Перейти к содержанию

Перевести код с C на C++


Рекомендуемые сообщения

Всем привет!

Помогите пожалуйста перевести код написанный на С в С++.

Для понимания контекста, я приведу бОльший кусочек кода, задача его в том чтобы приняв строку по USART запустить определенную функцию, причем часть имени функции будет присутствовать в принимаемой строке. Этот код прекрасно компилируется и работает в Atmel Studio 7, но возникла необходимость скомпилировать его в среде Arduino IDE. Однако компилироваться он не хочет, вылетая с ошибкой (как я понял) что часть когда написана в синтаксисе С, а не C++.

Скрытый текст

#define CMD_CNT  8 // количество команд
#define CMD(n) { .func = cmd_ ## n, .cmd = # n } // макрос для удобства описания элемента массива

/*Покажу на примере. Макрос CMD(BR) развернется в такую строку: {.func = cmd_BR, .cmd = "BR"}
  
Это запись инициализации стркутуры. С точками - имена полей (расширение GCC),
потом начальное значение. ## - команда конкатенации препроцессора, просто склеивает то,
что слева от нее с тем, что справа до первого символа-разделителя (запятая, пробел).
# - команда препроцессора преобразования литерала в строку, по сути обрамляет двойными кавычками то,
 что справа от нее до первого разделителя.
*/

#define STR_LEN  35 //максимальная длина строки команды по USART
static volatile uint8_t rx_pos; // позиция приема
static char obd_string[STR_LEN]; // принимаемая строка
static volatile uint8_t rx_complete; // флаг готовности строки

char sep [5]; //разделитель команды
static char obd_cmd[6]; //Переменная, в которую будут заноситься начальные адреса частей
static char transmit_cmd[100]; //отправка расшифрованной команды
char cmd_len; //длинна команды

typedef void (*handler_t)(char *obd_str); // тип "функция-обработчик строки"

// тип структуры для описания обработчика команды
typedef struct
{
  handler_t func; // функция-обработчик
  char    cmd[7]; // команда, состоит из двух символов и нуль-терминатора
} hndlr_t;

hndlr_t handler[CMD_CNT] = // массив структур команд
{
  CMD(ATSP0), //автоматическое определение протокола
  CMD(010C), //обороты двигателя
  CMD(0105), //температура охлаждающей жидкости
  CMD(0111), //дроссель
  CMD(010F), //температура воздуха на впуске
  CMD(010B), //давление во впускном коллекторе
  CMD(DF), //задержка выключения
  CMD(SY) //задержка выключения
};

void cmd_ATSP0(char *obd_str) //автоматическое определение протокола
{

}

void cmd_010C(char *obd_str) //обороты двигателя
{

}

void cmd_0105(char *obd_str) //температура охлаждающей жидкости
{

}

void cmd_0111(char *obd_str) //дроссель
{

}

void cmd_010F(char *obd_str) //температура воздуха на впуске
{

}

void cmd_010B(char *obd_str) //давление во впускном коллекторе
{

}

void cmd_DF(char *obd_str) // прототип обработчика команды SG
{

}

void cmd_SY(char *obd_str) // обработчик команды SY (синхронизация)
{

}

 

А вываливается, конкретно вот на этом участке кода с комментарием: comp:106:1: error: C99 designator 'cmd' outside aggregate initializer.

Скрытый текст

hndlr_t handler[CMD_CNT] = // массив структур команд
{
  CMD(ATSP0), //автоматическое определение протокола
  CMD(010C), //обороты двигателя
  CMD(0105), //температура охлаждающей жидкости
  CMD(0111), //дроссель
  CMD(010F), //температура воздуха на впуске
  CMD(010B), //давление во впускном коллекторе
  CMD(DF), //задержка выключения
  CMD(SY) //задержка выключения
};

 

Скрытый текст

432.JPG.885f27227354895ec7693eb8f998bc6b.JPG

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

1 час назад, -=FISHER=- сказал:

Помогите пожалуйста перевести код написанный на С в С++.

Описанное вот здесь: https://pcbartists.com/firmware/designator-outside-aggregate-initializer-solved/ не поможет?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

2 часа назад, -=FISHER=- сказал:

перевести код написанный на С в С++.

Да будет Вам известно, что С++ полностью включает в себя синтаксис языка С.

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, -=FISHER=- сказал:

перевести код написанный на С в С++

C++ это по сути тот же С только с "классами" то есть С++ это ООП, а С это процедурный язык.

В вашем случае скорее всего как пример

эта строка

CMD(ATSP0), //автоматическое определение протокола


должна как то вызывать эту функцию

void cmd_ATSP0(char *obd_str)


Но это не точно, это как предположение.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

4 часа назад, LiVit сказал:

не поможет?

Описанный там пример включает знаки "=" которые просто убрали всё заработало. У меня нет знаков равно...

 

3 часа назад, kt118 сказал:

Но это не точно, это как предположение.

Да именно так оно и работает))) меня интересует как сделать чтобы скетч скомпилировался.

4 часа назад, Alex сказал:

Да будет Вам известно

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

1931860013_.JPG.a3718537114e76464b3c3e42ed17576d.JPG

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Но, Вы же прекрасно понимаете, в чём проблема с кодом ? И устранить её, понимая код, не составит никакого труда.
В простейшем случае - выкинуть к чертям этот макрос и заполнить таблицу ручками.
Да и вообще, не понятно, к чему этот выпендрёжный финт ?  Ради экономии 5-ти байт исходного кода ?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

И ещё. Вы в курсе, что строка, типа "бла-бла", логически является константой ? По крайней мере, её длина (при создании копии в RАМ). И принимая на неё ссылку (указатель) в функции, необходимо указывать, что Вы изменять её не собираетесь.
В противном случае, компилятор вправе Вас обматерить.

Ссылка на комментарий
Поделиться на другие сайты

Скомпиллировалось без проблем чисто С-ным компиллятором для армов. И MinGW под винду тоже. Нет там ничего криминального. А "синтаксисом" С++ тут и не пахнет. Ищите проблему где-то в другом месте.

Навскидку советую обратить внимание на то, где находится <hndlr_t handler[CMD_CNT]> по отношению к объявлениям/определениям функций, адреса которых присваиваются его полям при инициализации. Он должен находится или после всех функций (после <cmd_SY> в вашем примере), либо их прототипы должны быть объявлены в самом начале модуля.

Если не поможет, то под капотом у ардуины находится обычный gcc-ный компилятор. У него есть такая замечательная опция "-E", которая позволяет выполнить препроцессинг модуля и посмотреть что получается в итоге с модулем. Вызывается как-то так: <${ПУТЬ-САМУРАЯ}\avr-gcc.exe -E test.c>, где <test.c> путь к вашему файлу. Он прямо в консоль должен выплюнуть результат, можно будет всё просмотреть и проанализировать.

А вообще использование такого рода макросов с аргументами, да с конкатенацией, да ещё с чем-то — практика довольно плохая. Превращает обычные ошибки в несуразную дичь, которую довольно сложно бывает диагностировать.

 

Изменено пользователем El-Shang
Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, -=FISHER=- сказал:

я пришел к выводу что некоторые отличия всё таки есть

откуда вы пришли к выводу :) ? У вас там написано, что используется расширение GCC. Расширение GCC это не С и не С++, это какая то самодеятельность GCC, которая не будет обрабатываться в любом другом компиляторе. Поэтому решением является НЕ использовать не стандартные расширения компиляторов, если вы хотите чтобы код компилировался в разных компиляторах, это не имеет отношения к С/С++, это особенность конкретного компилятора (несовместимость по допустимым конструкциям кода), точнее использование этой особенности в коде.

Изменено пользователем ruhi
дополнил

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Вообще, интересная картина нарисовывается. Человек выкладывает код, в котором есть коммент с наиподробнейшим описанием макроса. И тут же сразу задаёт вопрос по этому макросу :lol:

Ссылка на комментарий
Поделиться на другие сайты

Никакое это не расширение. Инициализации структуры в виде <struct a b = {.c = 1, .b = 2}> если верить этому источнику абсолютно стандартное средство начиная с C99. С великой долей вероятности автор просто чего-то недокопировал, недообъявил, забыл перенести какие-то определения, объявленные на уровне конфигурации проекта или ещё что-то подобное.

И потом, если оно работает в студии, то зачем тащить в ардуину? Разумнее как раз наоборот. Легче интегрировать что-то простое в что-то более сложное, а это как раз про них. У ардуины-то используется упрощенный (читай подмножество) С, если я всё правильно представляю. Правда, стандартные библиотеки содержащие всякие там digitalRead и digitalWrite не заедут, но там всё не так уж и сложно, чтобы не набросать замену. Но то такое. Каждый для себя решает.

Ссылка на комментарий
Поделиться на другие сайты

17.04.2021 в 16:50, Alex сказал:

Да будет Вам известно, что С++ полностью включает в себя синтаксис языка С.

Правильно только с  немного друими командами и С++ больше команд

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...