Вопрос № 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