ㅤ
Да и плюс тоже
Slava
ㅤ
А если юзб подать и убрать?
Slava
От юсп все ок
ㅤ
Я не уверен что эта колодка куда ты впаял для батарейки
ㅤ
Это скорей для внешнего источника. Прозвони
Slava
щас паяльник прогрею
Serjio
ㅤ
Гоша
Slava
Наверно на той плате просто разьем питания, на плате с аккумулятором совсем другая схема
Slava
Да, платы разные, вторая с настоящим аккумом
Slava
Алексей
Гоша
а дальше как заменять - strcpy или strcat - я не вижу тут разницы, шо то пойдёт, шо другое
Serjio
а если не найдет - как быть?
Гоша
Serjio
по итогу что? чатгпт молодец?
Slava
И вообще, я не понял что хотел автор, но вроде есть простая команда replace.
Гоша
Slava
В Ардуино иде точно есть. В моем говнокоде я её 500 раз использую
Гоша
нашёл такое
Гоша
https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/replace/
Гоша
но у человека были прост сишные строки
Slava
Может он просто не знает, что можно сделать стринг и реплайс?
Slava
Или он просто не ищет легких путей
Гоша
Может...
reza
reza
void str_replace(char *src, char *oldchars, char *newchars) { // utility string function
char *p = strstr(src, oldchars);
char buf[MAX_STRING_LENGTH];
do {
if (p) {
memset(buf, '\0', strlen(buf));
if (src == p) {
strcpy(buf, newchars);
strcat(buf, p + strlen(oldchars));
} else {
strncpy(buf, src, strlen(src) - strlen(p));
strcat(buf, newchars);
strcat(buf, p + strlen(oldchars));
}
memset(src, '\0', strlen(src));
strcpy(src, buf);
}
} while (p && (p = strstr(src, oldchars)));
}
Anton
void str_replace(char *src, char *oldchars, char *newchars) { // utility string function
char *p = strstr(src, oldchars);
char buf[MAX_STRING_LENGTH];
do {
if (p) {
memset(buf, '\0', strlen(buf));
if (src == p) {
strcpy(buf, newchars);
strcat(buf, p + strlen(oldchars));
} else {
strncpy(buf, src, strlen(src) - strlen(p));
strcat(buf, newchars);
strcat(buf, p + strlen(oldchars));
}
memset(src, '\0', strlen(src));
strcpy(src, buf);
}
} while (p && (p = strstr(src, oldchars)));
}
this code is really fragile!
Anton
void str_replace(char *src, char *oldchars, char *newchars) { // utility string function
char *p = strstr(src, oldchars);
char buf[MAX_STRING_LENGTH];
do {
if (p) {
memset(buf, '\0', strlen(buf));
if (src == p) {
strcpy(buf, newchars);
strcat(buf, p + strlen(oldchars));
} else {
strncpy(buf, src, strlen(src) - strlen(p));
strcat(buf, newchars);
strcat(buf, p + strlen(oldchars));
}
memset(src, '\0', strlen(src));
strcpy(src, buf);
}
} while (p && (p = strstr(src, oldchars)));
}
if you really have to use C for strings I would recommend to use something like this: https://github.com/jef-sure/ili9341_dgx/blob/main/main/str.h
reza
Anton
Anton
void str_replace(char *src, char *oldchars, char *newchars) { // utility string function
char *p = strstr(src, oldchars);
char buf[MAX_STRING_LENGTH];
do {
if (p) {
memset(buf, '\0', strlen(buf));
if (src == p) {
strcpy(buf, newchars);
strcat(buf, p + strlen(oldchars));
} else {
strncpy(buf, src, strlen(src) - strlen(p));
strcat(buf, newchars);
strcat(buf, p + strlen(oldchars));
}
memset(src, '\0', strlen(src));
strcpy(src, buf);
}
} while (p && (p = strstr(src, oldchars)));
}
What is the result of your code if you replace " " with " "? (one space symbol with two space symbols)
Slava
https://www.youtube.com/watch?v=0qSU0nxIZiE
Гоша
Гоша
это не совсем то что нужно было
Гоша
похоже на то как splice в JS работает
Anton
Anton
я потому сообщение про 221ю строку и удалил, что там надо "комбинацию" писать. но в отличии от предложенного кода, этот сложнее взорвать.
Гоша
тут надо по хорошему весь файл тащить. потому как требуются другие функции для работы с этим строковым типом
Anton
он небольшой и полезный. я написал его лет 15 назад...
Гоша
типа, str_destroy, str_empty, str_new_ln
Гоша
о, тогда объясните пожалуйста, нафига в _str_t поле char data[1] ??
Anton
фишка с последним полем типа массив длины 0 или 1 полезна когда память всё равно выделяется маллоком и можно указать сколько ж тебе на самом деле там надо
Anton
в моём случае там 1 дополнительный символ под \0 в случае если вдруг спрося аскии-зет строку
Гоша
а ещё вопрос, зачем выравнивание?
Anton
оптимизация мелкая. выравнивание выделенных блоков рам всё равно существует, так зачем лишний раз перевыделять тот же на самом деле кусок, если ты, к примеру, к строке по одному символу добавлешь
Anton
я мельком помню смотрел алгоритм маллока у есп32, там выравнивание, если правильно помню, 4 байта. потому тут так же
Гоша
Т.е. если я правильно понимаю, Вы полагаетесь на то, что всё равно память выделяется кратно 4 байтам. И если Вам надо, скажем, 13 байт, то Вы запросите у системы 16 с выравниванием?
Anton
если надо 13, я запрошу 16 и получу 16. если я запрошу 13, то получу всё равно 16, но не буду об этом знать и при добавлении 1 символа буду выделять новый блок на 14
Гоша
да, я так и понял ) Хитро )
Anton
интерфейс маллока не предполагает сообщить настоящий размер выделенного блока, к сожалению. было бы удобно
Гоша
ага. Тогда и выравнивание не потребовалось бы
Гоша
Интересно почему заморский гость сказал на String из ардуино что оно может создать проблемы с памятью в будущем?
Гоша
Anton
Anton
возможно, он имел в виду, что постоянное выделение динамической памяти приводит к проблемам. но его подход с фиксированным буфером точно хуже, там можно стек порушить на раз
Гоша
а как же zero-cost abstractions в C++? вроде там не должен быть большой оверхед. Стандартной библиотеки там всё равно нет.
Гоша
по поводу памяти - есть же способ - написать свой аллокатор
Гоша
хотя для небольшого проекта на ардуино это будет оверкил
Гоша
тем более для конкретной задачи замены подстроки
Гоша
но вообще концепция очень полезная для больших проектов где часто приходится объекты создавать/разрушать.
Anton
Anton
все остальные интерфейсы платформо-специфичны
Anton
Гоша
то что оно на malloc/free - это да