Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.11.2015, 07:30
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
Доброе утро. Учусь на втором высшем и столкнулся с заданием в котором нужно записывать значение в динамический массив, при условии в нем такого значения еще нету. Вот решение мое данной задачи, мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вариант через new: Код: 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. Хотелось бы узнать в чем причина недовольства и вариант с new я взял не свой конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 08:38
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
Smiz001 при этом не объясняют почему. Так вы бы спросили почему. Почему не спросили ? Мало ли кто и что говорит Зачем int& count ? Указатель pArr у вас избыточный(хотя это не ошибка). И я бы посоветовал вам возвращать результат, 1 - добавление прошло успешно, 0 в противном случае. А в целом ваша первая функция должна работать в соответствие с вашим заданием ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 08:55
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
SashaMercuryЗачем int& count ? чтобы Smiz001 Код: plaintext 1. Smiz001мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему. Потому что изначально память была выделена с помощью new. Работать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 09:04
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
SashaMercury, на мой вопрос почему был дан ответ: "Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит." SashaMercuryЗачем int& count ? Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого? SashaMercuryИ я бы посоветовал вам возвращать результат, 1 - добавление прошло успешно, 0 в противном случае Совет хороший, учту, только нельзя ничего возвращать в данной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 09:07
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
Dima TРаботать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc(). Вот этого даже и не знал. На будущее учту, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 09:13
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
Dima TSashaMercuryЗачем int& count ? чтобы Smiz001 Код: plaintext 1. Smiz001мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему. Потому что изначально память была выделена с помощью new. Работать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc(). В общем случае это так. Оператор new может быть перегружен и пользоваться собственным менеджером памяти. Но стандартный new/delete вызывает alloc()/free(). Так что должен работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 09:16
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
Smiz001 Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого? Да, можно и так. Но советую вам объединить указатель на начало массива и его размер в структуру ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 11:43
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
1й вариант при нехватке памяти аварийно завершится, 2й отработает верно, выбросив исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 13:49
|
|||
|---|---|---|---|
|
|||
Запись в массив через функцию |
|||
|
#18+
Зимаргл, реалоком же я расширяю память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 13:54
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
Smiz001Зимаргл, реалоком же я расширяю память. Память не резиновая, надо проверять результат "расширения". http://www.cplusplus.com/reference/cstdlib/realloc/?kw=realloc If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 18:54
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
Smiz001SashaMercury, на мой вопрос почему был дан ответ: "Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."Это не совсем правильное объяснение. ООП тут совершенно ни при чем. 1) Если ты выделил память через new а освободил через free (или наоборот alloc-delete) то могут возникнуть проблемы. Во многих реализациях С++, new и delete физически реализованы через вызовы alloc и free, в этом случае проблем не возникнет. Это возможно, но не гарантированно. Это могут быть и совершенно независимые механизмы основанные на разных принципах и тогда проблемы будут обязательно. 2) Если ты используешь библиотеки рассчитанные на С++, то с вероятностью 99.(9)% внутри этих библиотек используется new/delete механизм работы с памятью. Если ты используешь Си библиотеки, то в них 100% используется alloc/free механизм. Если ты используешь две такие библиотеки в одной программе, то есть большая вероятность что у тебя будут использоваться две модели памяти одновременно и придется следить чтобы не перепутать где какая. 3) Разные рантаймы по разному реализуют работу с памятью, поэтому очень часто при переносе библиотек из одного компилятора в другой возникают проблемы (особенно этим Builder знаменит). Лечится полной перекомпиляцией библиотек на новом рантайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 19:17
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
White OwlSmiz001"Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."ООП тут совершенно ни при чем.кое-причём, всё же. я думаю, в ответе имелось ввиду то, что операция new, помимо выделения памяти, вызывает конструктор создаваемого объекта, чего не делает malloc(), так же как free() не вызывает деструктор, в отличие от delete. Когда мы создаём встроенные типы разницы не видно, но, как только начинаем использовать классы - сразу наступаем на грабли во всю их ширину. И для ООП это различие в поведении куда важнее, чем возможно-различные менеджеры памяти у обоих механизмов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.11.2015, 21:26
|
|||
|---|---|---|---|
Запись в массив через функцию |
|||
|
#18+
egorych, malloc/free, это понятно. но ОО аналога у realloc нет, точнее есть расширяемые коллекции, в которых аналог может быть реализован более эффективно, чем создание инициализированного конструктором по умолчанию массива с последующим копированием и удалением каждого объекта. к стати конструктор копии по умолчанию просто делает memcpy из объекта в объект. никакой магии нет. так же можно поступить с массивом объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2018745]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 10ms |
| total: | 251ms |

| 0 / 0 |
