powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
82 сообщений из 82, показаны все 4 страниц
Замена в строке по словарю
    #40131260
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас есть ассоциативный массив std::map<std::string, std::string> который определяет замены, которые нужно провести в строке.

Неужели не существует готового модуля? Посмотрел в Boost.StringAlgo вроде ничего не нашёл.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131265
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...

Так в Boost.StringAlgo тоже не сказать что бы сложные алгоритмы. Зачем нужна эта библиотека?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131266
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...

На самом деле тут не все так просто с циклом:
1. Надо словарь отсортировать от длинных строк к коротким, т.к. короткая может сократиться, а потом длинная не совпадет, т.е. компаратор надо свой.
2. Одного цикла мало, т.к. если в цикле произошло сокращение, то надо еще один цикл, вдруг в результате сокращения сформировалась другая строка из словаря.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131271
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это проблемы составляющего словарь замен и список правил замены.

Потому-то и нет готового модуля, что у каждого требования свои.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131298
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут важно в каком порядке заменять. Я как-то раз по молодости делал из строки XML строку ....

Вобщем надо было амперсанд заменить на & ну и другие кавычки и знаки больше-меньше.

Можете себе представить что будет после
Код: plaintext
1.
& -> &amp;


и еще раз.

Короче Марковские алгоритмы отдыхали. Я переполнил память :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

2. Одного цикла мало, т.к. если в цикле произошло сокращение, то надо еще один цикл, вдруг в результате сокращения сформировалась другая строка из словаря.

Вот это самый интересный момент.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131315
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

боюсь спросить - а что за самый интересный момент?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гарантии того что алгоритм когда-то остановится.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131321
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Гарантии того что алгоритм когда-то остановится.

В обычном языке имеет смысл только сокращение, поэтому исходная подстрока должна быть больше замены. В таком случае гарантированно остановится.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131323
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте послушаем как себе это видит автор.

Для меня цена вопроса - в замене

Код: plaintext
1.
a -> b, b -> c, c -> a



Будем ли мы по 1 разу применять каждую замену? Или возможен вариант что
после того как все замены закончились - в строке внезапно появятся новые подстроки
которые снова открывают возможности к заменам.

Понятно что такая циклическая замена как я описал - безсмысленна. Но проговорить ее стоит
т.к. это вопрос стабильности API.

Чтоб не было строк-осцилляторов.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131326
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я решал задачу сокращения наименований товаров. Чтобы оно компактнее было, в ячейку грида на экране влезало как можно больше и т.п.
Тут бессмысленна замена подстроки на равную по длине.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из последних таких задач я помню надо было просто ключевые слова SQL такие как USER, TABLE, ORDER
в динамических запросах заменять на закавыченные.

И из логов пароли выкидывать. На звездочки ****** заменять. Ну и всякую sensitive-инфу. Личные данные там.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131332
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Это проблемы составляющего словарь замен и список правил замены.

Потому-то и нет готового модуля, что у каждого требования свои.

Спорное утверждение. Такие языки как XML схема и регулярные выражения тоже
не всем требованиям удовлетворяют, однако они существуют и востребованы…

PS: Нужно просто в макросе __DATE__ заменить месяцы. Jun -> Июнь. :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131360
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получилось у меня на лямбдах. Да и std::string оказался дремучий. Я совсем забыл что в нем нету replace_all.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using namespace std;

bool replace(string& expr, const string& from, const string& to) {
    size_t start_pos = expr.find(from);
    if(start_pos == string::npos)
      return false;
    expr.replace(start_pos, from.length(), to);
    return true;
}

string replace_all(string expr, const map<string,string>& replacement) {
  for(auto const& [key, val] : replacement)
    while(replace(expr, key, val));
  return expr;
}

int main(int argc, char **argv) {
  map<string, string> months = {{"политический авантюрист","господин президент"},{"SUN","Oracle"},{"Cool","Ice"}};
  cout << replace_all("Hey, SUN is Cool!", months) << endl;
  return 0;
}
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131375
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravСпорное утверждение. Такие языки как XML схема и регулярные выражения тоже не
всем требованиям удовлетворяют, однако они существуют и востребованы…

Потому что у них есть чёткие спецификации. У твоей задачи их нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131376
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное в Perl такая задача решается кратко.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131422
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Лично я решал задачу сокращения наименований товаров. Чтобы оно компактнее было, в ячейку грида на экране влезало как можно больше и т.п.
Тут бессмысленна замена подстроки на равную по длине.
Ну это только один из вариантов, когда используется замена. А если мы к примеру хотим в шаблоне заменить плейсхоледы на данные, нам наверное не надо, чтобы в уже подставленных данных снова искались плейсхолдеры?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131423
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО если надо просто заменить одну подстроку на другую в один проход, то доп.билиотек не надо никаких, даже если нет готовой функции для этого, то она пишется в пару строк.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131453
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего удивительного в таких запросах нет.
Порог вхождения в программисты настолько упал, что в npm например даже есть модуль is-odd.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131482
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Ничего удивительного в таких запросах нет.
Порог вхождения в программисты настолько упал, что в npm например даже есть модуль is-odd.

Ничего себе, я вам идею подарил на новый язык а-ля регулярные выражения. А Вы мне «начинающий программист».
Московский, в историю можете войти…

Это ж мне нужно из __DATE__ выделить сокращение месяца. Написать отображение Jun -> Июнь и т.д.
А лучше по английскому сокращению месяца определить его номер. Преобразовать в дату и распечатать
месяц компиляции в текущей локали. Потом запихнуть это в значение возвращённое __DATE__.

Я устану это программировать. :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131484
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Всё что было похоже на оффтоп - поудалял.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131582
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНаверное в Perl такая задача решается кратко.
посмотрел в сторону Perl -
не увидел что в языке Practical Extraction Report Language
это может решатся кратко.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131585
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тут важно в каком порядке заменять. Я как-то раз по молодости делал из строки XML строку ....

Вобщем надо было амперсанд заменить на & ну и другие кавычки и знаки больше-меньше.

Можете себе представить что будет после
Код: plaintext
1.
& -> &amp;


и еще раз.

Короче Марковские алгоритмы отдыхали. Я переполнил память :)
это судя по всему и есть Нормальные Алгорифмы Маркова

Тьюринг-полные, кстати

petrav, есть такой язык программирования - Рефал

что-то мне подсказывает, что самые эффективные его компиляторы делают дет. конечный автомат
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131588
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как-то я property менял в старых проектах. Точно не помню но как-то так.

Код: plaintext
1.
sed -i "s/Jun/Июнь/g" file.properties


Есть у утилиты брат-близнец awk. Делает примерно то-же. Но это всё мелочи по сравнению с Perl.
Насколько я разбираюсь он поглощает и покрывает все опции этих утилит и скриптует их исполнение в коде.

Я не утверждаю что в Перле это будет в 1 строку но должно быть побогаче чем sed. Особенно если у нас
задан справочник месяцев.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питонский вариант. Ну тоже не в 1 строку.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
dic = {'Jun':'Июнь', 'Jul':'Июль'}

def replace_all(text, dic):
    for key in dic:
        text = text.replace(key, dic[key])
    return text

replace_all("Release planned on 23-Jun-2023", dic)  

...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131607
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Питонский вариант. Ну тоже не в 1 строку.
Ну если тебе так сильно хочется, то на Перле это действительно можно уместить в одну строку:
Код: sql
1.
2.
3.
4.
5.
6.
%dic = ('Jun'=>'Июнь', 'Jul'=>'Июль');
$str = "Release planned on 23-Jun-2023";

$str =~ s/(@{[join('|', keys(%dic))]})/$dic{$1}/g;

print $str;
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131684
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Это ж мне нужно из __DATE__ выделить сокращение месяца. Написать отображение Jun -> Июнь и т.д.
А лучше по английскому сокращению месяца определить его номер. Преобразовать в дату и распечатать
месяц компиляции в текущей локали.
Если постараться, в С++ это можно сделать во время компиляции. Но не в две строчки.
https://stackoverflow.com/questions/11697820/how-to-use-date-and-time-predefined-macros-in-as-two-integers-then-stri
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131685
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот интересно если сделать кросс-компиллятор С++ => Templates/Macros C++.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131755
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
mayton
Питонский вариант. Ну тоже не в 1 строку.
Ну если тебе так сильно хочется, то на Перле это действительно можно уместить в одну строку:
Код: sql
1.
2.
3.
4.
5.
6.
%dic = ('Jun'=>'Июнь', 'Jul'=>'Июль');
$str = "Release planned on 23-Jun-2023";

$str =~ s/(@{[join('|', keys(%dic))]})/$dic{$1}/g;

print $str;


Но нам нужна динамическая генерация словаря. Как опция. Это же моветон такое писать.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131800
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131802
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.

В классических регулярках можно проводить замену по словарю?

Но я не это имел в виду. А замену которую семантически можно было бы описать так:

Код: plaintext
Короткое английское название месяца -> Полное название месяца в текущей локали

Или из БД. Вот что я понимал под динамикой.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131819
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. у тебя самый первый пост начинается так
Допустим у нас есть ассоциативный массив std::map<std::string, std::string>
тоесть он как-бы уже задан.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131829
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Но нам нужна динамическая генерация словаря. Как опция. Это же моветон такое писать.
Чего??? Как ты собираешься делать динамическую генерацию словаря? Увидел новое слово в тексте, сразу добавил его в словарь? А на что ты новое слово заменять собираешься?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131830
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Anatoly Moskovsky
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.

В классических регулярках можно проводить замену по словарю?
В классических - нет. И что вообще считать "классическими"?

petrav
Но я не это имел в виду. А замену которую семантически можно было бы описать так:

Код: plaintext
Короткое английское название месяца -> Полное название месяца в текущей локали

Или из БД. Вот что я понимал под динамикой.
Вообще-то, такая задача решается проще. Берем строку, читаем ее как дату, потом пишем эту дату в нужной локали. Текстовой заменой никто не занимается.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно тема топика про это и была. Локализовать _DATE_ + _TIME_ .
Я-бы средствами сборщиков делал. Забил-бы ункиальный плейсхолдер в исходник.
А потом за 1 миг до компилляции просто текстовой заменой вставлял бы даны в русском языке.
Типа свой пре-процессор.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131882
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl

Вообще-то, такая задача решается проще. Берем строку, читаем ее как дату, потом пишем эту дату в нужной локали. Текстовой заменой никто не занимается.

Локаль уже стоит другая, а в __DATE__ всё по "американски". :)
Я не вижу как в std::get_time() локаль передать. Но попробовать можно.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131886
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЛокаль уже стоит другая, а в __DATE__ всё по "американски". :)

Потому что так гласит стандарт:
macros__DATE__
expands to the date of translation, a character string literal of the form "Mmm
dd yyyy". The first character of "dd" is a space if the day of the month is less
than 10. The name of the month is as if generated by std::asctime()
asctimeThe function does not support localization, and the newline
character cannot be removed.

petravЯ не вижу как в std::get_time() локаль передать.
asctimePOSIX marks this function obsolete and recommends locale-dependent
std::strftime instead.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131905
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот интересно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void experimental::run()
{
#define IS_RU_STR 0

    std::setlocale(LC_TIME, "ru_RU.utf-8");

    std::tm tm{};
    char const *curr = __DATE__;
#if IS_RU_STR
    std::istringstream ss(u8"Янв 11 2022");
#else
    std::istringstream ss(curr);
#endif
    ss >> std::get_time(&tm, "%b %d %Y");

#if !IS_RU_STR
    char str[100];
    std::strftime(str, 100, "%b %d %Y", &tm);
#endif
}


Если IS_RU_STR==0 оно парсит дату по-английски, а потом печатает её по-русски.
Если IS_RU_STR==1 дату по-русски оно и не парсит.

А почему так?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131907
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели потому, что С++ класс использует С++ локаль, а не С? Да не, это было бы
слишком просто...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131909
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Неужели потому, что С++ класс использует С++ локаль, а не С? Да не, это было бы
слишком просто...

Все функции находятся в `std`, следовательно это всё C++.
Да, кстати, MSVC + файл исходников в utf8+BOM. Но я удалил префикс u8 и ничего не изменилось. Русскую дату оно не парсит.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravВсе функции находятся в `std`, следовательно это всё C++.

Это неправильно следствие:
https://en.cppreference.com/w/cpp/locale/setlocale The setlocale function installs the specified system locale or its portion as
the new C locale.

Проверь конкретно какая локаль имбуёвана у твоего стрингстрима.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131919
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВсе функции находятся в `std`, следовательно это всё C++.

Это неправильно следствие:
https://en.cppreference.com/w/cpp/locale/setlocale The setlocale function installs the specified system locale or its portion as
the new C locale.

Проверь конкретно какая локаль имбуёвана у твоего стрингстрима.

Да, imbue() работает. Если локаль мы можем установить локально для этого потока, то это решает проблему корректно.
Независимо от текущей глобальной локали. Спасибо!
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131923
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. Если ставится задача прочитать из строки дату в заданной локали, но
при этом не затрагивая глобальную (установленную) локаль:

Код: plaintext
1.
2.
3.
std::istringstream ss(__DATE__ __TIME__);
ss.imbue(std::locale("en_US.utf-8"));
ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");


Ошибки парсинга проверить нельзя, плохо. Это точно самое разумное решение?
У меня такое ощущение, что я что-то куда-то не туда примудил.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131924
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravУ меня такое ощущение, что я что-то куда-то не туда примудил.

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

Соответственно и решение - в системе сборки, а не исходниках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131948
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravУ меня такое ощущение, что я что-то куда-то не туда примудил.

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

Соответственно и решение - в системе сборки, а не исходниках.

И каково же по вашему решение?

PS: В документации по созданию официальной сборки написано: пересобрать приложение, т.е. с нуля.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131956
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и исходники не трогать. Просто при сборке положить в Windows-ресурсы строку с датой.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него Линух. В винде было бы проще: там в заголовке экзешника есть специальное
поле для таймштампа сборки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131967
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так попробовать. Свой макрос.

Код: python
1.
2.
3.
4.
5.
6.
7.
#!/bin/bash

// ... set russian locale for shell

cdate=$(date +"%Y-%m-%d")

gcc petrav.c -o petrav.exe -DRUSSIAN_DATE="$(cdate)"
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131977
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в makefile это еще проще делается.
Добавляется вот такой код:

Код: plaintext
1.
2.
3.
4.
5.
.PHONY: timestamp.h

timestamp.h: 
	@echo "Rebuilding $@"
	@echo "#define BUILD_TIME=\"`date`\"" > $@

А timestamp.h ставится пререквезитом для какого-нибудь about.cpp и инклудится в нем.
.PHONY объявляет цель как "делать всегда" и на каждый запуск make этот файл будет обновляться. А какой там формат date напечатает - зависит от его параметров, и он наследует локаль системы. Все просто и легко.

А еще туда можно запихнуть всякие
Код: plaintext
1.
2.
	@echo "#define BUILD_PLATFORM=\"`uname -m`\"" >> $@
	@echo "#define BUILD_STATION=\"`uname -n`\"" >> $@
И так далее, насколько фантазии хватит.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132002
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

У него Линух. В винде было бы проще: там в заголовке экзешника есть специальное
поле для таймштампа сборки.

У меня Win + MSVS.

Для даты сборки я не помню стандартного свойства в *.rc файле. Но дело не в этом.
Кто данные будет вносить в этот файл?

Оно конечно можно углубиться в MSBuild и на C# в PreBuild что-то вкорячить.
Но это не так просто.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132009
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не специалист по Windows-сборочным тулзам. Но там что-то должно быть.
Помнится была консольная утилита rc.exe. Тоесть цена вопроса - перед компилляцией
просто обновить string ресурс с текущей датой.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132016
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravКто данные будет вносить в этот файл?

Компилятор.
https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
https://stackoverflow.com/a/26297/13964273
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132017
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКомпилятор.

Ну или можно делать как я, заполнять поле ручками после сборки:
Код: sql
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
#include <new.h>
#include <windows.h>
#include <stdio.h>

void ErrorHandler(const char* message)
{
   printf("failed: %s\n", message);
   exit(1);
}

int main(int argc, char* argv[])
{
   if (argc < 2)
   {
     printf("Usage: SetTimestamp <file name>...\n");
     exit(1);
   }

   for (int i=1; i<argc; i++)
   {
     printf("Setting timestamp for file \"%s\"...  ", argv[i]);

     HGLOBAL hResLoad;   // handle to loaded resource
     HMODULE hExe;       // handle to existing .EXE file
     HRSRC hRes;         // handle/ptr. to res. info. in hExe
     HANDLE hUpdateRes;  // update resource handle
     LPVOID lpResLock;   // pointer to resource data
     BOOL result;

     // Load the .EXE file that contains the dialog box you want to copy.
     hExe = LoadLibraryEx(argv[i], NULL, DONT_RESOLVE_DLL_REFERENCES);
     if (hExe == NULL)
     {
         ErrorHandler(TEXT("Could not load exe."));
     }

     // Locate the dialog box resource in the .EXE file.
     hRes = FindResource(hExe, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
     if (hRes == NULL)
     {
         ErrorHandler(TEXT("Could not locate version resource."));
     }

     // Load the dialog box into global memory.
     hResLoad = LoadResource(hExe, hRes);
     if (hResLoad == NULL)
     {
         ErrorHandler(TEXT("Could not load resource."));
     }

     // Lock the dialog box into global memory.
     lpResLock = LockResource(hResLoad);
     if (lpResLock == NULL)
     {
         ErrorHandler(TEXT("Could not lock resource."));
     }

     VS_FIXEDFILEINFO* info;
     UINT len;
     if (VerQueryValue(lpResLock, "\\", reinterpret_cast<void**>(&info), &len) == 0)
     {
       ErrorHandler(TEXT("Could not query fixed version info"));
     }

     if (info->dwSignature != 0XFEEF04BDL)
     {
       ErrorHandler(TEXT("Signature check failed"));
     }

     FILETIME time;
     GetSystemTimeAsFileTime(&time);

     info->dwFileDateLS = time.dwLowDateTime;
     info->dwFileDateMS = time.dwHighDateTime;

     DWORD ResSize = SizeofResource(hExe, hRes);

     LPVOID NewBuf = malloc(ResSize);
     memcpy(NewBuf, lpResLock, ResSize);

     // Close file to let it be opened for write
     if (!FreeLibrary(hExe))
     {
         ErrorHandler(TEXT("Could not free executable."));
     }

     // Open the file to which you want to add the dialog box resource.
     hUpdateRes = BeginUpdateResource(argv[i], FALSE);
     if (hUpdateRes == NULL)
     {
         ErrorHandler(TEXT("Could not open file for writing."));
     }

     // Add new version resource to the update list.
     result = UpdateResource(hUpdateRes,
         RT_VERSION,
         MAKEINTRESOURCE(VS_VERSION_INFO),
         MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
         NewBuf,                         // ptr to resource info
         ResSize);       // size of resource info

     if (result == FALSE)
     {
         ErrorHandler(TEXT("Could not add resource."));
     }

     // Write changes to FOOT.EXE and then close it.
     if (!EndUpdateResource(hUpdateRes, FALSE))
     {
         ErrorHandler(TEXT("Could not write changes to file."));
     }

     free(NewBuf);

     printf("success.\n");
   }

}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132074
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формат ресурс-файла описан https://formats.kaitai.io/windows_resource_file/index.html

По крайней мере можно кастомными средствами его генерить.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132077
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну как бы лезть в PE Format… ну это как бы слишком, имхо.

А про VS_VERSION_INFO, это я знаю. Где-то у меня даже модуль есть
для чтения версии приложения от туда. И скрипт увеличивающий версию
приложения при каждом коммите в мастер.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132078
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно кому нужна дата сборки в бинарнике? Заказчику?

Разработчику сорцах оно не надо. Если сорцы стоят под версионным контролем то дату мы всё равно видим
через git/svn.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСобственно кому нужна дата сборки в бинарнике?

ну, во-первых, она красиво светится в системных свойствах файла. Во-вторых, у
меня она выводится опять же для красоты в окошке About. В остальном я полагаюсь
на нумерацию версий.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132083
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Собственно кому нужна дата сборки в бинарнике? Заказчику?

Да, заказчику. Инженер смотрит на дату создания приложения и примерно помнит хронологию развития.
А номера версий они не запоминают. Они наоборот регулярно ломают нумерацию версий просто так.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonСобственно кому нужна дата сборки в бинарнике?

ну, во-первых, она красиво светится в системных свойствах файла. Во-вторых, у
меня она выводится опять же для красоты в окошке About. В остальном я полагаюсь
на нумерацию версий.

А если качать через веб или ftp то дата создания файла обычно .. тово?
Или тогда надо весь дистрибутив паковать в zip чтобы гарантировать сохранность дат.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю медленно: дата сборки пишется в заголовок экзешника, а дата релиза - в
заголовок информации о версии. Естественно, они не могут потеряться просто так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132126
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну сорян. Просто показалось что речь идет о файловых атрибутах.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132156
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
Собственно кому нужна дата сборки в бинарнике? Заказчику?

Да, заказчику. Инженер смотрит на дату создания приложения и примерно помнит хронологию развития.
А номера версий они не запоминают. Они наоборот регулярно ломают нумерацию версий просто так.

Кто ломает?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132188
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
petrav
пропущено...

Да, заказчику. Инженер смотрит на дату создания приложения и примерно помнит хронологию развития.
А номера версий они не запоминают. Они наоборот регулярно ломают нумерацию версий просто так.

Кто ломает?

Инженеры.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132189
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Повторяю медленно: дата сборки пишется в заголовок экзешника, а дата релиза - в
заголовок информации о версии. Естественно, они не могут потеряться просто так.

Мне кажется ваша программа только обновляет windows resources. В PE Format она не лезет.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132206
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravМне кажется ваша программа только обновляет windows resources. В PE Format она
не лезет.

Да. Потому что окно системных свойств и мой код отображают дату из ресурсов, а
не заголовка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132253
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Изопропил
пропущено...

Кто ломает?

Инженеры.

они приложение собирают?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132270
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... переполнил память :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using namespace std;

bool replace(string& expr, const string& from, const string& to) {
    size_t start_pos = expr.find(from);
    if(start_pos == string::npos)
      return false;
    expr.replace(start_pos, from.length(), to);
    return true;
}

string replace_all(string expr, const map<string,string>& replacement) {
  for(auto const& [key, val] : replacement)
    while(replace(expr, key, val));
  return expr;
}

int main(int argc, char **argv) {
  map<string, string> months = {{"политический авантюрист","господин президент"},{"SUN","Oracle"},{"Cool","Ice"}, {"","null"} };
  cout << replace_all("Hey, SUN is Cool!", months) << endl;
  return 0;
}

...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132315
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
petrav
пропущено...

Инженеры.

они приложение собирают?

Они пишут ТЗ и ТУ. Они ПО тестируют, отвечают за ПО перед заказчиком, пишут на ПО документацию и впаривают ПО военной приёмке. Ещё их сношают в первом отделе.

Золотые люди…
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132322
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravОни пишут ТЗ и ТУ. Они ПО тестируют, отвечают за ПО перед заказчиком, пишут на
ПО документацию и впаривают ПО военной приёмке.

И как это может повлиять на версию, которая суть строка в файле, лежащем в в СКВ?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132332
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravОни пишут ТЗ и ТУ. Они ПО тестируют, отвечают за ПО перед заказчиком, пишут на
ПО документацию и впаривают ПО военной приёмке.

И как это может повлиять на версию, которая суть строка в файле, лежащем в в СКВ?..

Потому что есть документ ТУ, в нём расписано всё: версии ПО, условия, требования и прочее. Этот документ пишут инженеры (и там написана версия). Военные люди специфичные (особенно в войсках). Версию 2 или 3 они понимают. Версию 3.1 понимают уже с трудом. Версию 5.56 (где 56 — это сквозной счётчик обновлений ПО) — военные это вообще не поймут и не подпишут.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132333
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И? Версия продукта и версия файла это отдельные строки в ресурсе и они не
обязаны совпадать. У меня, например, версия продукта просто "1.0" в то время как
версия файла - полностью четырёхчленная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132335
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

И? Версия продукта и версия файла это отдельные строки в ресурсе и они не
обязаны совпадать. У меня, например, версия продукта просто "1.0" в то время как
версия файла - полностью четырёхчленная.

И то что когда военный откроет About или свойства файла... И увидит там то, что он не подписывал (какие-то версии файла и т.д.) — то будет скандал. Поэтому до этого сдали версию 3.55, а потом 2.1. Потому что… забыли и подписали. И всё.

Вы может расскажете, в чём смысл вашей четырёхзначной версии? По каждому компоненту.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132341
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravИ то что когда военный откроет About или свойства файла... И увидит там

....то, что ты ему выведешь. Идея вывести в About одну версию, а в логи другую -
реально настолько запредельно сложная?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132344
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravИ то что когда военный откроет About или свойства файла... И увидит там

....то, что ты ему выведешь. Идея вывести в About одну версию, а в логи другую -
реально настолько запредельно сложная?..

Так и в логи (точнее отчёты) нельзя выводить реальную версию. Отчёты тоже на подпись.

Идей то у меня много. Но разговор шёл о том как инженер ломает продуманную систему нумераций версий.

Вы о своей так и не рассказали.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dimitry Sibiryakov

И? Версия продукта и версия файла это отдельные строки в ресурсе и они не
обязаны совпадать. У меня, например, версия продукта просто "1.0" в то время как
версия файла - полностью четырёхчленная.

И то что когда военный откроет About или свойства файла... И увидит там то, что он не подписывал (какие-то версии файла и т.д.) — то будет скандал. Поэтому до этого сдали версию 3.55, а потом 2.1. Потому что… забыли и подписали. И всё.

Вы может расскажете, в чём смысл вашей четырёхзначной версии? По каждому компоненту.

С моей точки зрения релиз программного продукта - это bundle, архив, упаковка.
Где есть манифест с описанием где есть список фичей и багофиксов + цифровые подписи
его создателей.

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

Кликать мышкой в свойства файла - это забавная практика но если приложение оконное - можно
сделать Menu->About. Или если консольное - то сам бох велел писать версию туда.

А современные практики поддержки уже предлагают систему где название версии - это
строка которая несет более широкие смыслы чем просто счетчик. Например инкремент
минорной части гарантирует что совместимость интерфейсов библиотек все еще сохраняется
а инкремент мажорной версии - имеет право игнорировать обратную совместимость.

Более подробно тут:

https://www.everything2.com/index.pl?node_id=1128644
https://tldp.org/HOWTO/Software-Release-Practice-HOWTO/naming.html#AEN192

Хотя каждая организация внутри себя всё равно пере-договаривается о смыслах версий.
Но главное что заказчк понимает что его ждет. Хотфикс. Или релиз-кандидат.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132362
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM

Код: plaintext
1.
  {{"политический авантюрист","господин президент"},{"SUN","Oracle"},{"Cool","Ice"}, {"","null"} 


А зачем такое писать? Ключ - пустой. Это не наш кейс. Не бизнес-кейс я-бы сказал.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132364
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravТак и в логи (точнее отчёты) нельзя выводить реальную версию. Отчёты тоже на
подпись.

Мы, походу, о разных вещах говорим...

petravВы о своей так и не рассказали.
Когда мне присылают багреп с отладочным логом на гигабайт и/или крэш-дамп
памяти, по точной версии я беру из архива файлы с отладочной информацией для
отладчика и/или map файл для ручного пересчёта дампа стэка в имена методов.
Потому что сборка приложения - на мне. И никакой инженер тут совершенно ни при
чём: ему попадает готовый бинарник.

Если у тебя сборкой занимается какой-то левый инженер - тогда пусть он же тебя и
обеспечивает вышеперечисленным для отладки. И совершенно всё равно какая там
версия им прописана, всё, что тебе надо, это соответствие адресов памяти строкам
кода снапшота СКВ из которого шла сборка.

А что за хренотень ты творишь с датами - мне совершенно непонятно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132517
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Bred eFeM

Код: plaintext
1.
  {{"политический авантюрист","господин президент"},{"SUN","Oracle"},{"Cool","Ice"}, {"","null"} 


А зачем такое писать? Ключ - пустой. Это не наш кейс. Не бизнес-кейс я-бы сказал.

Потому что это ваш косяк. Причём очевидный (я не увидел). Тесты вы не написали.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40132519
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это POC. Он без тестов идет обычно. Берите - дорабатывайте. Маржинальные кейсы - это уже в процессе практики доводят.

Я вообще не знаю ни одного разработчика который сразу пишет работающий код и для всех кейсов и без ошибок.

И дело даже не в том ошибается он или нет а в том что контракт еще не определен строго.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40134976
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

то же,
но поизящней. слегка.

Код: powershell
1.
2.
3.
4.
5.
6.
%dic    = qw <jun июнь jul июль jan январь dec декабрь>; 
$str    = q  <В средней полосе месяц jan завсегда перед месяцем jun>;
$"      = q  <|>;
@rex    = keys%dic;    

print $str =~s / @rex / $dic{$&} /xgre; 
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40134989
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661
White Owl,

то же,
но поизящней. слегка.

Код: powershell
1.
2.
3.
4.
5.
6.
%dic    = qw <jun июнь jul июль jan январь dec декабрь>; 
$str    = q  <В средней полосе месяц jan завсегда перед месяцем jun>;
$"      = q  <|>;
@rex    = keys%dic;    

print $str =~s / @rex / $dic{$&} /xgre; 

Да, так действительно покрасивше будет.
Я и забыл о $". Слишком уж неявный join - неявный :)
...
Рейтинг: 0 / 0
82 сообщений из 82, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]