Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 471
от 20.07.2006, 23:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 347, Экспертов: 45
В номере:Вопросов: 2, Ответов: 3


Вопрос № 49159: Здраствуйте. вот текст программы. при компиляции на turbo c++ 3.0 компилируеться нормально программа выполняеться и выдает верный ответ а вот при запуске .ехе файла в винде выдаеться ошибка, а при запуске через досовский режим работает нормально!!<br...
Вопрос № 49237: Здравствуйте эксперты. Подскажите я выделяю динамически массив оператором new вот так int *arr = new int[100] потом занашу туда данные. Как мне увиличить или уменьшить размер массива не создовая новый и копируя туда мой массим. з.ы.подска...

Вопрос № 49.159
Здраствуйте. вот текст программы. при компиляции на turbo c++ 3.0 компилируеться нормально программа выполняеться и выдает верный ответ а вот при запуске .ехе файла в винде выдаеться ошибка, а при запуске через досовский режим работает нормально!!
А при компиляции на borland c++ window 5.0 выдате ошибку о неверной памяти или не верной адресации???
вчем ошибка и как запустить ее через windows xp pro??

Приложение:

Отправлен: 14.07.2006, 23:06
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: SergeyMAC
Здравствуйте, HITY!
Не уверен, что ошибка только в этом, но у вас везде явно задан размер для int и он равен 2 байтам (тогда как он различается на разных архитектурах и врядли может быть меньше 4 байт), возможно надо изменить тип на short int или вместо двух использовать sizeof(int)

P.S я имею ввиду строки типа:
memset(temp[x].m,NULL,160);
memset(s->m,NULL,2*80);

и т.д.

Удачи...
---------
броня крепка, и танки наши быстры
Ответ отправил: SergeyMAC (статус: 6-ой класс)
Ответ отправлен: 14.07.2006, 23:40


Вопрос № 49.237
Здравствуйте эксперты.
Подскажите я выделяю динамически массив оператором new вот так
int *arr = new int[100] потом занашу туда данные. Как мне увиличить или уменьшить размер массива не создовая новый и копируя туда мой массим.
з.ы.подскажите на сайте rsdn.ru есть список стате всех статей или надо пользоваться только поиском
Отправлен: 15.07.2006, 22:25
Вопрос задал: Gray (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Sling
Здравствуйте, Gray!
Не думаю что это возможно реализовать так просто. Дело в том, что данные массива должны располагаться в памяти подряд. Тоесть, если после выделенного участка памяти будут расположены другие данные, то для увеличения размера массива их необходимо будет перенести. Даже если в С++ и есть функции, которые это обеспечат (никогда не интересовался, использую класс vector, что и вам рекомендую), то они всё-равно должны будут выполнять копирование массива в памяти, а значит прироста в скорости их использование не даст. Эффект будет тот же, что и при обычном создании массива большего размера, а затем - копирования.
PS: Уменьшить размер массива - не проблема. Для этого даже не нужно выполнять каких-то особых операций, главное - не забыть освободить память.
PPS: Класс вектор работает достаточно медленно, поэтому если скорость работы очень важна, иногда стоит таки выделить заранее массив побольше, а в функции передавать не весь массив, а указатель на него.
---------
The fear of blood tends to create fear for the flesh
Ответ отправил: Sling (статус: 1-ый класс)
Ответ отправлен: 16.07.2006, 01:32
Оценка за ответ: 5
Комментарий оценки:
Спастбо

Отвечает: Rok-set
Здравствуйте, Gray!
Динамические масивы предназначены для выделения в памяти данных, когда в процессе работы программы становится известным размер необходимых данных, если этот размер меняется, то Вам необходим другой тип хранения переменных. Советую воспользоваться списком. Я не знаю, реализован ли в С++ этот клас и его функциональность, но Вы можете без особых проблем за полчаса создать свой с необходимой функциональностью.
Рецепт: Делается запись, в которой первый элемент является указателем на следующий элемент списка, а второй элемент - Ваши данные. В последнем элементе списка в перваую часть ставится "заглушка". Если Вам надо найти n-й элемент - загоняете число в цикл и заставляете "пробежаться" по указателям n раз до нужного елемента. Из записи берёте данные. При необходимости добавления данных либо слияния списков достаточно изменить значения указателей граничных элементов. При этом становится очень удобным добавление записей в середину списка без доп. сортировок, и естественно, длинна списка ограничена только обьемом динамической памяти.
Ответ отправил: Rok-set (статус: 4-ый класс)
Ответ отправлен: 18.07.2006, 06:58


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное