|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.09.2014, 20:56 | #1 | |||
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
Работа с динамической памятью. Помогите пожалуйста разобраться.
Здравствуйте.
Было дано вот такое задание: Цитата:
На лекции было рассказано как выделять память в с и с++ стиле, и про ссылки с указателями. Полученное задание меня обездвижило на минут 30) Почитав коменты к заданию более менее стало понятно что делать. Получился вот такой нерабочий код №1: Код:
В попытках всё переосмыслить был рождён другой нерабочий код №2: Код:
Предполагаю, что у меня где-то серьёзная поломка мозга и абсолютное непонимание задания... Ещё не понятен момент, про работу while(cin.get(ch)) Каким образом это работает? Вот я запускаю программу, программа ожидает ввода. Я ввожу некоторые символы и нажимаю ентер. Это получается, что в ch будет содержаться массив с этими символами и цикл запустится 1 раз? Или будет происходить цикл каждый раз когда я нажимаю на клаве символ? Или произойдёт срабатывание цикла столько раз, сколько я ввёл символов, т.е. в условие цикла отправится массив после нажатия ентер? Коментарии, которые возможно помогут понять суть задания(хотя мне не особо помогли): Коментарий преподавателя: Цитата:
Цитата:
Забыл добавить: Можно использовать только iostream. Последний раз редактировалось evsign; 27.09.2014 в 21:00. |
|||
27.09.2014, 21:13 | #2 | |
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
Цитата:
После отправки ввода нажатием enter цикл выполняется столько раз, сколько было введено символов. Т.е. по итерации на каждый символ. Только вот почему тогда цикл не завершается, когда я ввожу 0? Чувствую, скоро будет рождён неработающий код №3 )) |
|
27.09.2014, 23:12 | #3 |
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
На другом форуме мне подсказали, что лучше не делать сразу большой буфер, а создавать новый по мере заполнения начального.
Получился пока ещё не работающий вот такой код Код:
И правильно ли я переписываю старый буфер в новый? |
29.09.2014, 00:28 | #4 |
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
Уже не актуально, во всём разобрался)
|
29.09.2014, 11:34 | #5 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Цитата:
|
||
29.09.2014, 17:32 | #6 |
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
Почему не всегда это правильно?) Так же вроде более бережно расходываться память будет. Да и размер максимальной строки, которая может быть подана на вход я не знаю)
Эт я с начала не оч понял как работают указатели и вообще запутался в этой теме) Уже разобрался) Получился вот такой, наконец-то рабочий код: Код:
|
29.09.2014, 17:48 | #7 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Обычно (да почти всегда) на длину строки есть ограничения. Ну например длина сообщения в протоколе ICQ имеет предел в районе 5000 символов. Если бы ты писал консольный клиент аськи - то разумно было бы сделать размер буфера в 5000 символов и считывать нужное количество символов через getline. Если внезапно юзер ввел больше 5000 символов ты, соблюдая протокол, должен все равно разбить его сообщение на 2 (или более) - поэтому юзаешь getline в цикле. Цитата:
Твой код экономит память, но грузит процессор (который выделяет память), копирует старую строку в новую и освобождает память. Выделение и освобождение - это не такой простой процесс как тебе кажется, не стоит делать это часто, как и копировать лишний раз. Ну и ваще, по заданию тебе сказали getline использовать, значит так и надо делать, а не велосипеды строить. |
||
29.09.2014, 17:51 | #8 | |
Новичок
Джуниор
Регистрация: 27.09.2014
Сообщений: 6
|
Цитата:
А по заданию как раз и надо было сделать такой велосипед в образовательных целях) По идее вообще memcpy нельзя было даже юзать. |
|
29.09.2014, 18:04 | #9 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Паскаль. Работа с динамической памятью. | McFrey | Помощь студентам | 1 | 06.04.2012 16:56 |
Работа с динамической памятью через указатели. Загадочная ошибка. | Hqw33 | Общие вопросы C/C++ | 2 | 28.03.2012 18:42 |
Работа с ListBox и Edit и динамической памятью | Serebah | Помощь студентам | 5 | 19.11.2010 13:41 |
Помогите пожалуйста с динамической памятью и указателями | Riddick2013 | Помощь студентам | 1 | 19.12.2007 14:41 |