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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2017, 21:43   #71
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Никогда не знаешь сколько выделить...
Так не поступают профессионалы. Если неизвестно сколько выделять, то сначала нужно с этим определиться, либо строить код так, чтобы это происходило автоматически. Решение и того и другого зависит от конкретной задачи и инструментария. strcat предназначен для быстрой конкатенации строк с заранее подходящим буфером. Это позволяет избегать ненужных сравнений размера.
Для контроля переполнения буфера есть strncat, который принимает размер буфера и не даст его переполнить. Автор статьи, видимо, не в курсе, что такая функция есть.

Последний раз редактировалось Croessmah; 27.06.2017 в 21:46.
Croessmah вне форума Ответить с цитированием
Старый 27.06.2017, 21:45   #72
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

То, что конкретно мне неудобно, я показал на своём (пусть и некрасивом) примере, в котором я выделяю память внутри функции, а чищу её в совсем другом месте, и это тоже не всегда удобно.
bugaboo вне форума Ответить с цитированием
Старый 27.06.2017, 21:48   #73
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
в котором я выделяю память внутри функции, а чищу её в совсем другом месте, и это тоже не всегда удобно.
Стандартный подход любой C-библиотеки. В С++ решается умными указателями.
Croessmah вне форума Ответить с цитированием
Старый 27.06.2017, 22:00   #74
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
либо строить код так, чтобы это происходило автоматически.
Речь именно об этом, и именно поэтому strcat и т.п. уже проехали.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Для контроля переполнения буфера есть strncat, который принимает размер буфера и не даст его переполнить. Автор статьи, видимо, не в курсе, что такая функция есть.
автор статьи - бывший руководитель команды программистов Microsoft Excel, а также сооснователь Stack Overflow. Сама статья довольно старая, но суть проблемы, тем не менее, актуальна. В этом отрывке он скорее намекает на то, что, грубо говоря, под слово "Боря" выделен массив в 1000 char. А надо - всего 4.
bugaboo вне форума Ответить с цитированием
Старый 27.06.2017, 22:04   #75
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Стандартный подход любой C-библиотеки.
и, тем не менее, не очень удобно. Например, когда выделение памяти (вызов функции) происходит в конструкторе.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
В С++ решается умными указателями.
вот бы ещё при помощи этих умных указателей организовали нормально сложение C-строк, чтобы мы тут не изобретали велосипеды. И чтобы для сложения a и b не приходилось вызывать функцию с 3 или 4 аргументами, и всё равно бы мы получали результат не в том виде, каком нужно.

Последний раз редактировалось bugaboo; 27.06.2017 в 22:10.
bugaboo вне форума Ответить с цитированием
Старый 27.06.2017, 22:20   #76
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
вот бы ещё при помощи этих умных указателей организовали нормально сложение C-строк, чтобы мы тут не изобретали велосипеды.
Как это связано? Умные указатели решают множество проблем, связанных с управлением объектами. Одна из них - управление памятью. К сложению строк они не причастны.
Цитата:
Например, когда выделение памяти (вызов функции) происходит в конструкторе.
Следовательно почистить нужно в деструкторе. Если эти данные используются только в конструкторе, то пихаем указатель в умный указатель и готово - всё само почистится. Вот только в C нет конструкторов, так же как и классов и умных указателей.
Цитата:
Сообщение от bugaboo Посмотреть сообщение
А надо - всего 4.
Надо 5. И надо было выделять 5, а не 1000.
Цитата:
Сообщение от bugaboo Посмотреть сообщение
Речь именно об этом
Часто сидите на подвешенной к потолку люстре? Нет? А почему?
Наверное, неудобно, можно упасть, надо как-то туда еще забраться так ведь?
А причина всего этого в чем? В том, что люстра не для этого предназначена.
Вот и strcat не предназначен для решения такой проблемы. Его цель - копирование char'ов в заранее подготовленный буфер, причем он не знает как этот буфер выделялся. Простой пример:
Код:
char *p = my_allocate_buffer(5);
*p = 0;
strcat(p, "my string");
Проблемы в strcat:
Неизвестен размер буфера. Как его определить? Никак. Ок, переделали strcat так, что он теперь принимает размер буфера и изменили наш код:
Код:
strcat(p, 5, "my string");
Сталкиваемся с другой проблемой. Что делать при недостатке буфера. Перевыделять память? Ок. Какими средствами выделять и освобождать?
Если с помощью free и malloc, то мы тупо сделаем фигню, потому что буфер выделялся функцией my_allocate_buffer, которая, возможно, использовала не malloc (и подобные), а значит к такому указателю применить free нельзя.
Это значит, что наша новая strcat должна еще принимать указатели на функцию аллокации и удаления. Уже не хилый интерфейс, да? strcat решает задачу копирования символов, а не задачу копирования символов с перераспределением памяти (это уже несколько задач, кстати).

Последний раз редактировалось Croessmah; 27.06.2017 в 22:22.
Croessmah вне форума Ответить с цитированием
Старый 27.06.2017, 23:02   #77
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Вот и strcat не предназначен для решения такой проблемы.
Так давайте прекратим его обсуждение в рамках данной темы, поскольку он явно не всем подходит. В том числе и мне.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Как это связано?
Никак. Просто утверждаю, что, теоретически, при помощи умных указателей могла бы быть реализована функция сложения C-строк, требующая всего 2 аргумента (слагаемые) и не накладывающая ограничений в виде заранее выделяемой конкретного размера памяти.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Надо 5. И надо было выделять 5, а не 1000.
Отнюдь, я не описался.
Надо - именно 4. Когда я (тупой юзер) смотрю на слово "Боря", я знаю, что в нём 4 буквы, и, при этом, знаю, где у него начало и конец. Всё остальное - это уже вопросы реализации, и меня (тупого юзера) они в принципе не касаются. В моём мозгу (мозгу тупого юзера) слово "Боря" занимает ровно 4 ячейки памяти. А не 5, 10 или 1000. При этом, я(тупой юзер) понимаю, что "Б" + "оря" = "Боря", и для меня (тупого юзера) не секрет, где конец у "Б", где конец у "оря" и где конец у результата их сложения. Поэтому я (тупой юзер) хочу именно функцию, которая заберёт у меня "Б" и "оря" и выдаст мне результат длиной = длина("Б") + длина("оря"), равный "Боря", и на всё остальное мне плевать, в том числе и на то, где у них там конец.
При этом я (тупой юзер) не хочу следовать совету умных юзеров и использовать string, поскольку аргументы и результат мне нужны именно в виде C-строки, а точнее, в виде строки длиной = 4 символа char +- то, что меня не волнует.
Чтобы с каждым из этих char я мог работать именно как с переменной типа char (что я и демонстрировал в своем примере, складывая и деля их, запуская по ним циклы и т.д.) И никакого иного типа переменные я не хочу использовать и не хочу ничего знать про них, а также про реализацию массивов char, переменных типа string и т. п.
bugaboo вне форума Ответить с цитированием
Старый 27.06.2017, 23:04   #78
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Так если юзер тупой, то дальше общаться нет смысла. Тупой юзер сломает что угодно, хоть там тысячу раз проверки и перевыделения делайте.
Croessmah вне форума Ответить с цитированием
Старый 27.06.2017, 23:05   #79
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
слово "Боря" занимает ровно 4 ячейки памяти.
Тогда strcat здесь вообще не к месту.
Croessmah вне форума Ответить с цитированием
Старый 27.06.2017, 23:10   #80
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Когда я (тупой юзер)
На этом можно заканчивать разговор. С и С++ создавались и развиваются с позиции прокладка умная и знает, что хочет... а у вас даже не программист.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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