Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
1

Перевод с С на С++

19.04.2018, 17:37. Просмотров 1889. Ответов 3

Приветствую, имеется следующее:
1) Исходная кодовая база написанная на Си объемом примерно 150 k cloc (далее "код"). C использованием всех возможностей си - начиная от макро-магии и тайпдефов, заканчивая полиморфизмом через указателями на функции и void* в контекстах.
2) Интеграционные тесты поверх данного кода (текущие, но проходящие по логическим проверкам)
3) Библиотечные интерфейсы, в которые обернут данный код
4) Библиотеки и приложения, которые используют данные библиотечные интерфейсы на более высоком уровне.
5) Компиляторы gcc/clang с поддержкой с++17, в наличии. Целевые платформы Unix-like.

Общие решаемые задачи:
1) Исправление множественных ошибок работы с памятью в сишной кодовой базе
2) Избавление от повторяющегося кода в данной кодовой базе (страницы и страницы копи-пасты с изменением пары строк на другие значения)
3) Модернизация кодовой базы (улучшение структуры, строгая типизация, упрощение интерфейсов использования).
4) На любом из этапов преобразования, база должна быть в работоспособном состоянии - нельзя взять и всё написать с нуля, или на месяц оставить код не компилирующимся. Рефакторинг выбранной части должен занимать не более 40 человеко-часов.

Для решения поставленных задач был выбран "путь самурая", а именно следование правилу CPL.1 из cpp core guidelines

Вопрос к аудитории:
Какие изменения (путем последовательного рефакторинга исходной кодовой базы) Вы предложили бы применить к коду в первую очередь при переходе из си в c++. Для получения максимального эффекта по решаемым направлениям, при наименьших вложениях человеческих ресурсов. (Исходя из того, что данный код уже собирается как C++ код, ограничений на используемые библиотеки нет, лишь бы opensource, любые фичи из c++17 доступны).

Пример структуры ожидаемого ответа:
Кликните здесь для просмотра всего текста

Если, в кодовой базе есть много мест, где идет работа с массивами данных, то в первую очередь следуя совету солидного источника я бы рассмотрел возможность замены:
C++
1
const unsigned char * buff_ptr, int buff_size
в сигнатурах на:
C++
1
 gsl::span<const std::byte> buffer
Поскольку это:
1) улучшит читаемость
2) расширит сферу применения данных функций
3) увеличит типобезопасность
4) позволит добавить проверки на вменяемость на момент компиляции.

Но необходимо учитывать, что трудозатраты по выполнению подобной замены: высокие, поскольку изменяется количество аргументов функции, и на каждое такое изменение, придется производить обновление кода всех мест вызова.
Плюсом является то, что путем рефакторинга подобную замену можно выполнять поэтапно оставляя за счет перегрузки обе версии функции до момента, когда вызовов старой версии не останется в коде.


Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2018, 17:37
Ответы с готовыми решениями:

Перевод кода с Паскаля (перевод в метры)
var a,b,d:integer; c,e:real; begin writeln('1-дециметр 2-километр'); writeln('3-метр ...

Заменить в строке все пробелы на перевод строки, а перевод строки изменить на два перевода
Меня интересует следующий вопрос: как заменить в моем стринге все пробелы на переходы на новую...

Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой,...

Перевод
Может кто на С++ перевести? uses crt; const t=0.01;//точность сравнения вычисленных величин...

3
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
19.04.2018, 18:47 2
Пример показывает как раз то, что надо делать в последнюю очередь.

Я бы на первых этапах заменил бы всю дин. память на смарт поинтеры, вектора и прочие контейнеры.
В небольшой оставшейся части мест (если такое будет), заменил бы сишную работу с памятью на плюсовую new, new[].
Потом ввёл бы сишные строки std::string/std::string_view.

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

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

Возможно дальше следовало бы ввести понятия классов и переместить часть функционала в них (по желанию).

Использовать фичи ради фич я бы не стал. Если есть возможность использовать С++17, это не значит, что его надо пихать везде где надо или не надо.

И не забудьте часто делать осмысленные комиты и пушить их на сервер. Одно из главных - правильно подобрать гранулярность изменений.
1
зомбяк
1412 / 1077 / 309
Регистрация: 14.05.2017
Сообщений: 3,523
19.04.2018, 19:16 3
Цитата Сообщение от Melg Посмотреть сообщение
страницы и страницы копи-пасты с изменением пары строк на другие значения
Выделять копи-пасту в функцию, а затем функции группировать в цикл (меняющиеся куски строк добавлять в массив, создающийся в конструкторе или статический).
Для контроля выхода за границы использовать например std::vector::at (http://ru.cppreference.com/w/c... /vector/at) вместо operator[] массива (и, по необходимости, сделать улавливатель исключений для логов мест выхода при работе).
Цитата Сообщение от Melg Посмотреть сообщение
заканчивая полиморфизмом через указателями на функции
Указатели на функции и в С++ тоже изредка могут быть полезны, особенно там, где полиморфизм получится черезмерно громоздким.
1
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
21.04.2018, 17:20  [ТС] 4
MrGluck, я привел это просто как пример, в плане формы ответа, а не как первое, что стоит сделать. Кстати, на счет замены си строк, как Вы считаете, имеет смысл двигаться по вертикальным срезам от вызывающей стороны к вызываемым функциям, или наоборот? Или выделять отдельные модули, и внутри каждого из них сначала производить замену, не трогая интерфейсы? Просто в данный момент в базе много мест, где используется strdup и char * - фактически владеющий указатель на строку, над которым рано или поздно вызывают free.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2018, 17:20

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

Перевод if(n*n+m*m=i) then if(i<>a[c-1]) на с++
if(n*n+m*m=i) then if(i&lt;&gt;a)

Перевод с С++ в С#
Ребят помогите пожалуйста, есть код на ++, но мне он нужен на шарпе. Знаю что тема глупая, но очень...

Перевод из 10-ой СС в 2-ую
Пытался реализовать с помощью цикла и рекурсии, подскажите пож, что в рекурсии исправить или как...

Перевод
Гугол говорит, что &quot;символ&quot; по-английски &quot;simbol&quot;. Но &quot;char&quot; вроде тоже символ. Как его полное...

Перевод из 2 в 16 СС
Здравствуйте, нужна программка перевода из 2 в 16 СС, в наиболее простом виде(...

Перевод с С++
Всем привет. Нужно перевести это код с СИ++ в код дельфи. В си я вообще не секу. Это ...


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

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

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