Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2017, 23:20   #81
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

...тупым юзерам можно учить JS и прочие php, там все "как нада", глючит тоже не хуже люстры с наездником )
....а в С/С++ языках и Unix системах простая идеология - 1 программа (или 1 процедура) должна выполнять ровно 1 действие. Поэтому strcat копирует строку и ничего более. Комбайнеры сидят на виндовс и изобретают эксели и прочие Nero.
alexzk вне форума Ответить с цитированием
Старый 27.06.2017, 23:37   #82
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Тогда strcat здесь вообще не к месту.
Именно. И такой подход (подход, при котором слово "Боря" занимает 4 ячейки памяти) использован в Excel.
Цитата:
Сообщение от p51x Посмотреть сообщение
С и С++ создавались и развиваются с позиции прокладка умная и знает, что хочет... а у вас даже не программист.
И вот я (умный программист) пишу для него (тупого юзера) код функции, которая сделает ему "тепло" + "ход" = "теплоход", ничего не требуя взамен. Он тупой, он ничего не знает про выделение памяти, выделять её не намерен, и дай бог, чтобы удалось его уговорить её потом почистить. Пока что мы остановились на том, что он (другой, ещё более умный программист, чем я) предложил такой код для реализации моего криво реализованного алгоритма:
Код:
void sum(char*& c, char* a, char* b)
{
    auto la = strlen(a);
    auto lb = strlen(b);
    
    c = new char[la + lb + 1];
    
    char *dst_first = c;
    char *dst_second = c + la;
    
    char cache = *b;
    
    for (; (*dst_first = *a) && (*dst_second = *b); ++a, ++b, ++dst_first, ++dst_second){
    }
    
    char *dst_adv = dst_second;
    char *src_adv = b;    
    if (*a) {
        dst_adv = dst_first;
        src_adv = a;
    }
    for (;(*dst_adv = *src_adv); ++dst_adv, ++src_adv){
    }
    *(c + la) = cache;
}
Я бы продолжил обсуждение с этого момента, поскольку последующие 6 страниц никаким конкретным кодом для моей ситуации не увенчались.
Тут у меня 2 вопроса:
1) длинновато
2) а есть ли необходимость в предложенном мной алгоритме с меньшим количеством итераций, или эффективнее будет просто пропустить 2 цикла сначала по a, а потом по b?
bugaboo вне форума Ответить с цитированием
Старый 27.06.2017, 23:50   #83
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
предложил такой код для реализации моего криво реализованного алгоритма
Цитата:
Сообщение от bugaboo Посмотреть сообщение
длинновато
И глуповато. Но изначальная задача была сделать именно так. Эта функция ни разу не аналог strcat. Эта функция - более высокоуровневая, причем плохо расширяемая.
Цитата:
Сообщение от bugaboo Посмотреть сообщение
а есть ли необходимость в предложенном мной алгоритме с меньшим количеством итераций, или эффективнее будет просто пропустить 2 цикла сначала по a, а потом по b?
Сугубо теоретически оно будет медленнее.
Всё остальное зависит от конкретных условий.

Цитата:
Сообщение от bugaboo Посмотреть сообщение
И такой подход (подход, при котором слово "Боря" занимает 4 ячейки памяти) использован в Excel.
Да ладно? Просто всё остальное делается "под капотом". Либо завершающий ноль, либо хранение размера, либо и то и другое сразу. Ну и там врядли char используется для представления одного символа, т.к. один байт всего. А значит должны быть либо широкие символы и всё для работы с ними, либо мультибайтные строки и всё для работы с ними.)))
Croessmah вне форума Ответить с цитированием
Старый 28.06.2017, 00:05   #84
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Да ладно? Просто всё остальное делается "под капотом".
Само собой! Но допустим, что для меня неприемлем вариант:
Код:
выделил память размером = длина a + длина b + 1
запустил функцию сложения
...
мне нужно
Код:
запустил функцию, а она сама всё выделила
...
очистил память
такой вариант моему тупому юзеру кажется наиболее доступным для понимания.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Эта функция - более высокоуровневая, причем плохо расширяемая.
а куда там расширять? Мне нужно просто c = a + b и больше ничего.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Сугубо теоретически оно будет медленнее.
Что? Вариант с 2 циклами? То есть, в моем алгоритме, теоретически, есть смысл?
Тогда что в этом коде глуповатого? Моей задачей не является сделать аналог strcat, а, напротив, сделать функцию "всё в одном, тока не забудь потом удалить".
bugaboo вне форума Ответить с цитированием
Старый 28.06.2017, 00:08   #85
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:

запустил функцию, а она сама всё выделила
...
очистил память
std::string, QString ...

Цитата:
"всё в одном, тока не забудь потом удалить"
выж понимаете, что ..."выделяторы" памяти могут быть разные, соотв. им и "удалятор" свой нада...память от new нельзя удалять через free - самый простой пример. И каким местом юзер тупой должен додуматся, чем вы там выделили (это если юзер +1 собссный выдедятор не придумал).

Последний раз редактировалось alexzk; 28.06.2017 в 00:11.
alexzk вне форума Ответить с цитированием
Старый 28.06.2017, 00:11   #86
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
std::string, QString ...
ну вы серьезно? я же 100 раз уже написал - string не предлагать...
bugaboo вне форума Ответить с цитированием
Старый 28.06.2017, 00:14   #87
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
мне нужно
Тогда какого дьявола он взял C? Пусть идет лесом туда, куда выше указали. Видимо, юзер настолько тупой, что не может инструмент себе выбрать. Ну или, как минимум, не понимает сути языка C. Таких, обычно, называют "неосиляторами", т.к. через какое-то время у них начинает бомбить, они идут в Java и дальше всем рассказывают какие они не тупые и как Java убивает C.
Всё банально, как всегда.

Цитата:
Сообщение от bugaboo Посмотреть сообщение
То есть, в моем алгоритме, теоретически, есть смысл?
В любом алгоритме есть смысл. Даже в медленной пузырьковой сортировке. На определенных данных она окажется быстрее остальных.

Цитата:
Сообщение от bugaboo Посмотреть сообщение
"всё в одном, тока не забудь потом удалить"
Если C++, то лучше вернуть умный указатель из функций, а не переписывать старый. Причем, заметьте, плюсовики обязательно забудут сделать delete[].

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Тогда что в этом коде глуповатого?
Цитата:
Сообщение от bugaboo Посмотреть сообщение
Мне нужно просто c = a + b и больше ничего.
Например, такая функция, будучи собранной в библиотеку оказывается совершенно непереносимой. Упс, неожиданно, да? Думаю, вполне можно сделать кейсы, где оно и на уровне исходников загнется. То бишь это сразу не универсальная функция и работать будет не везде. )))

Последний раз редактировалось Croessmah; 28.06.2017 в 00:17.
Croessmah вне форума Ответить с цитированием
Старый 28.06.2017, 00:14   #88
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
ну вы серьезно? я же 100 раз уже написал - string не предлагать...
Так вариантов нет - или делаете класс, который сам все рулит, или делаете как минимум параметры аллокатора и деаллокатора в добавок к ф. Потом еще проблемы полезут, но сначала это.
alexzk вне форума Ответить с цитированием
Старый 28.06.2017, 00:18   #89
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

....откройте исходники LUA. Там чистый С. И очень эффективны строки, настолько эффективны, что я 20мб файл, как строку за доли секунды вчитываю.
...и посмотрите на объем "великов" там и подводных камней в виде параметров конфигурации, правда оно все работает, даже на роутере.
alexzk вне форума Ответить с цитированием
Старый 28.06.2017, 00:19   #90
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
И очень эффективны строки
wine вообще умудряется обрабатывать API другой системы и другой формат бинарников. :D
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 22:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27