|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Доброго времени суток господа. Пишет вам человек, который слишком долго занимался VBA. Но речь не о том зачем это и как с этим бороться. Речь и сложности восприятия концепции, что теперь казавшийся ранее простецкий string не так прост и с массивами в контексте VBA тоже всё было беззаботно. Но теперь нужно понимать и уметь реализовывать весь этот функционал в C++ без использования соответствующих библиотек. Только char, указатели и работа с памятью. Может что ещё забыл упомянуть. Пытаюсь решить в образовательных целях следующую задачку: Считываю поток ввода посимвольно пока не достигну конца потока и возвращаю C-style строку с прочитанными символами. В процессе чтения каждый раз перевыделяю память. Память возвращаемая из функции *getline() и *resize(...) будет освобождена оператором delete[]. Я как то не правильно подаю данные на вход в resize потому, что когда доходит дело до delete[], программа перестаёт выполняться корректно. Подскажите пожалуйста в чём я неправ? Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 07:20 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
строка в C/C++ в классическом ее понимании всегда должна заканчиваться нуль-терминатором, то есть у вас не может быть по определению Код: plaintext 1. 2.
надо так, хотя бы: Код: plaintext 1. 2. 3.
но лучше на 1 символ + нуль-терминатор: Код: plaintext 1. 2. 3.
В противном случае вы выделяете память в ноль байт и пытаетесь с ней работать. Зачем ? Намного лучше и эффективнее с точки зрения производительности сократить обращения к менеджеру памяти и копирование до минимума, то есть изначально выделить некоторую область памяти и использовать ее пока она не будет исчерпана. Например, выделяем память на 10 символов + нуль-терминатор: Код: plaintext 1. 2. 3. 4.
По мере заполнения выделенного буфера, вы уменьшаете счетчик szMemLeft и когда он достигнет отметки 0, а символ \n еще не найден, наступает момент перенести содержимое из старого буфера в новый и переинициализировать szMemLeft и szMemSize. Новый буфер опять же лучше выделять сразу больше, например, удвоенного размера по сравнению с предыдущим, чтобы не выделять память под обному байту. Для копирования участков памяти из старого буфера в новый лучше использовать memcpy_s, а не самописный цикл ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 08:42 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Cerebrum, Спасибо! Успел и сам понять: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 08:52 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Cerebrum, По поводу последнего абзаца с кодом и пояснением отдельное спасибо! А так мне надо было решить задачку по работе с памятью именно в С++ стайл. А это операторы New+Delete и New[]+Delete[] Ваше пояснение, как я понимаю, имеет отношение к C-стайлу (malloc, realloc, calloc, free). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 09:01 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAVА так мне надо было решить задачку по работе с памятью именно в С++ стайл. А это операторы New+Delete и New[]+Delete[] Ваше пояснение, как я понимаю, имеет отношение к C-стайлу (malloc, realloc, calloc, free). Где ты там увидел у него malloc/free? "Получить тормоза на ровном месте" это вовсе не "С++ стайл". Я бы (принимая во внимание современные реалии) выделял память по килобайту, не меньше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:31 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
ИМХО если уж "С++ style", то используй std::vector . Если "С style", то никаких new, delete, cin, т.к. это С++. Зато в С есть realloc() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:44 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
По-хорошему просто взять std::string и не заниматься велосипедостроением ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:49 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Dima TПо-хорошему просто взять std::string и не заниматься велосипедостроением +1 ну или: Код: plaintext 1.
IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 11:01 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAV, ты уж определись что тебе по настоящему надо. С-style - это достаточно низкоуровневое программирование где нет iostream. Вот посмотри как в сях работают с файлами. Там файловые указатели FILE *, handles. У тебя - какой-то микс С/C++. И правильно пишут дескыть - бери std::string. Бери и используй. Чего-тебе еще? P.S. Вобщем... или трусы надень. Или крест сними. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 14:15 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAV, Одна из проблем в коде: Код: plaintext 1.
В выделенном должно быть &&. А иначе только правая часть от "," ограничивает цикл, и при расширении строки вы читаете за пределами выделенного блока памяти, а при сокращении - пишете за его пределами (первое - возможный крэш, второе - гарантированно либо крэш либо поврежденная куча). Ну а в целом перевыделять память каждый раз всего на один байт больше это перебор. Если заранее размер не извествен, то выделять нужно в N раз больше чем предыдущий размер. N например 2 (но могут быть и другие). И начальный размер ставьте какой-нибудь разумный типа 16 или даже 256. Потому что строка эта скорее всего короткоживущая, и лучше сократить кол-во выделений памяти чем экономить несколько сотен байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 15:11 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Ну и: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извините за. ЗЫ. Хотя в образовательных целях полезно, как вы, извращаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 15:18 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
В тему статических анализаторов. Недавно в форуме появлялся один господин который парил нам PVS-Studio. Анализатор должен был среагировать на странное появлении операции запятая в условии цикла. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 18:42 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Dima TПо-хорошему просто взять std::string и не заниматься велосипедостроением +1000000 нифига не понял, зачем писать велосипед ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 21:51 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухнифига не понял, зачем писать велосипедну, например, с чем я последним столкнулся (пока 11-е не вышли) - невозможно передавать в конструктор строки "всё подряд", например чиселки, чтобы на выходе получать строку из числа. int 14 -> "14". А, так да, после VB, где среда за всем бдит сама, трудно самому следить за деталями ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 05:54 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
CEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Код: plaintext 1.
ИЛИ Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 13:00 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухCEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Сказано же было "пока 11-е не вышли" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 17:56 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Пора на Haskell переходить. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:20 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyполудухCEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Сказано же было "пока 11-е не вышли" они вышли 8 лет назад так мы и C начнём вспоминать, какой там был ад здесь современная ситуация, где человек пришёл изобретать велосипед в 2019 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:36 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonПора на Haskell переходить. Не? он медленнее ( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:36 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonПора на Haskell переходить. Не?c C++ не переходють). Тут очень близко к железу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:52 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухmaytonПора на Haskell переходить. Не? он медленнее ( Возможно. Просто тут смотрю … борьба за красоту кода идет. Вот и вспомнил к месту. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 20:02 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухтак мы и C начнём вспоминать, какой там был ад Ад будет когда приходишь в проект, а там никто с указателями не умел работать, и тебе это разгребать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 22:37 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, На старые проекты (легаси) наценки)) и молоко за вредность. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:09 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
"переходить" надо на клеточное программирование, вот куда надо стремиться все эти груды железа ничто, по сравнению с маленькой точкой, которую мы всего 60 лет назад ещё толком разглядеть не могли это самый совершенный ИИ из доступных нам и он в "открытом доступе" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:24 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудух"переходить" надо на клеточное программирование, вот куда надо стремиться все эти груды железа ничто, по сравнению с маленькой точкой, которую мы всего 60 лет назад ещё толком разглядеть не могли это самый совершенный ИИ из доступных нам и он в "открытом доступе" Я так понимаю... дело в шляпе. Остался пустяк. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:26 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухклеточное программированиеинформатика) Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 00:08 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
я не знаю, каков Haskell, но на плюсах можно реализовать любую красоту кода же? Данный смайлик - это ирония? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 05:30 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
шаблоны, лямбды, многозадачность... красота CEMbполудух"переходить" надо на клеточное программированиечто это такое? Почему "переходить" в кавычках? При чём тут ИИ? потому что там точно такие же парадигмы (только попродвинутей) куча функций, и каждая делает исключительно свою 1 задачу а в целом "жизни", как таковой, нет она из таких вот функций состоит мы даже можем тупо взять и скопировать всю эту схему - получить готовый ИИ только нафига? когда он уже есть супер-совершенный ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 12:40 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Такой ИИ имелся в виду? Больше похож на генератор случайных или псевдо-случайных поверхностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 23:29 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухmaytonПора на Haskell переходить. Не? он медленнее (Там был С--. И весьма немедленные парадигмы параллельности. Собственно, аналогов я нигде не видел ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 00:30 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonТакой ИИ имелся в виду? Больше похож на генератор случайных или псевдо-случайных поверхностей. да не это дичь какая-то имелось ввиду, что каждый белок это функция со своей одной-единственной задачей например, репликация ДНК: разобрать ДНК на 2 полоски = белок №1 потом белок №2 помечает начало второй полоски а белок №3 добавляет остальные азотистые основания на каждую полоску белок №4 затем убирает ту метку, а белок №3 заменяет пустое место недостающими основаниями ну и потом заканчивает всю процедуру белок №5 короче, лучше 1 раз увидеть: ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 01:08 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
суть ИИ в том, что там нет этого самого "живого разума" (знать бы что это) там искусственный некий "разум" так вот в клетке есть ядро но оно опять же не разум, как таковой, оно состоит из простейших ф-й, которые вкупе создают завод по производству чего-то (зависит от клетки) каждая клетка это автономная единица, в которой разнообразные мелкие функции делают всю работу: собирают, разбирают, защищают, пополняют склады, выносят мусор и даже уничтожают саму клетку (там есть функция "самоуничтожения", на случай захвата и "фсёпрапала") гениально написано, но разума, как такового, там всё же нет даже в ядре (которое, кстати, есть не у всех) просто набор функций ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 01:16 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудух, Разум это другой уровень. Как шаблоны в С++))). До определенного часа Х нам не дано понять. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 07:13 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
ну вообще-то "на дне" там очень близко к простейшему true/false вся логика сводится к этому, как я понял ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 12:14 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
CEMbя не знаю, каков Haskell, но на плюсах можно реализовать любую красоту кода же? Данный смайлик - это ирония? Модераторы, если вы правите сообщения, то, хотя бы, пописывайте, что это было исправлено. А то выглядит, как будто это я написал. Нет, это не ирония, на плюсах реализовано много всяких языков, которые "лучше и удобнее". Логично же, что если на плюсах можно сделать язык, который лучше и удобнее делает что-то, то на сяхх это тоже можно делать лучше и удобнее, нет? Язык сложный, да, но я могу по мере потребности оборачивать сложные вещи в простые конструкции и упрощать код. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 12:17 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудух, да не это дичь какая-то имелось ввиду, что каждый белок это функция со своей одной-единственной задачей например, репликация ДНК: разобрать ДНК на 2 полоски = белок №1 потом белок №2 помечает начало второй полоски а белок №3 добавляет остальные азотистые основания на каждую полоску белок №4 затем убирает ту метку, а белок №3 заменяет пустое место недостающими основаниями ну и потом заканчивает всю процедуру белок №5 Ага. Из старого курса дискретной математки я вспоминаю. Толи Марковские замены. Толи цепочки. Вобщем был такой аппарат программирования. Типа берется строка. И к ней многократно применяется строковая замена одних групп симовлов на другие. И были примеры даже алгоритмов на этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 19:23 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
CEMbCEMbпропущено... Данный смайлик - это ирония? Модераторы, если вы правите сообщения, то, хотя бы, пописывайте, что это было исправлено. А то выглядит, как будто это я написал. Нет, это не ирония, на плюсах реализовано много всяких языков, которые "лучше и удобнее". Логично же, что если на плюсах можно сделать язык, который лучше и удобнее делает что-то, то на сяхх это тоже можно делать лучше и удобнее, нет? Язык сложный, да, но я могу по мере потребности оборачивать сложные вещи в простые конструкции и упрощать код. Это я ошибся. Вместо ответа получилось редакция. Надеюсь никто сильно не пострадал? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 19:52 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonАга. Из старого курса дискретной математки я вспоминаю. Толи Марковские замены. Толи цепочки. Вобщем был такой аппарат программирования. Типа берется строка. И к ней многократно применяется строковая замена одних групп симовлов на другие. И были примеры даже алгоритмов на этом. цепи Маркова это в СЕО популярны а вот в ДНК - нет там совсем другой принцип и цели случайная буква просто подменяется на другую получаем "эволюцию вида" если выживет - годен (вся эволюция основана на убийствах) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 21:53 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonЭто я ошибся. Вместо ответа получилось редакция. Надеюсь никто сильно не пострадал?Код бросил удивление ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2019, 06:26 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухmaytonАга. Из старого курса дискретной математки я вспоминаю. Толи Марковские замены. Толи цепочки. Вобщем был такой аппарат программирования. Типа берется строка. И к ней многократно применяется строковая замена одних групп симовлов на другие. И были примеры даже алгоритмов на этом. цепи Маркова это в СЕО популярны а вот в ДНК - нет там совсем другой принцип и цели случайная буква просто подменяется на другую получаем "эволюцию вида" если выживет - годен (вся эволюция основана на убийствах) Это ГА. А я имел в виду строгие алгоритмы. Типа исходная строка = состояние. Строки замены - это есть алгоритмы. Вернее их некое сериализованное состояние. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2019, 11:16 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
свежачок ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 17:06 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017602]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 161ms |
0 / 0 |