![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Вобщем проблема такая:
я выделил слолько-нибудь памяти
теперь мне надо еще. Как добавить еще памяти? ЗЫ C тока начал учить, потому вопрос может быть и ламерский.... Это сообщение отредактировал(а) BSOD - 9.2.2006, 17:15 -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
-------------------- Теперь при чем :P |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
сэнкс
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
малость не работает....
int *g[10000],*p[10000],*kg; a=1 b=2 c=3 -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Ignat |
|
||||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Я вот в эти две строчки вообще не въехал:
Здесь вообще ничего не меняется (под *g[a] и так уже была выделена память объемом в sizeof(int) ):
-------------------- Теперь при чем :P |
||||
|
|||||
| BSOD |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
дык а как именно добавить(!) еще один int?
впринципе их можно заменить на any_action(); -------------------- как корабль назовешь - то на нем и напишешь |
||||
|
|||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Нужно накапливать где-то размер компонент g[], чтобы писать в realloc вместо sizeof(int) этот размер.
А вообще - несравнимо удобнее vector, его для того и писали. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
realloc используется для изменения памяти отведенного под тип данных. Т.е. как увеличения, так и уменьшения. Второй параметр определяет новый размер памяти, отведенный тип, в данном случае int. Это необходимо, если нужно, к примеру, строку char[32] удлиннить до char[64]. Но тип int имеет стандартную длину 32 бита, его можно привести к типам short и long. А добавить можно инкрементировав индекс указателя.
А вот если будет any_action, то и ошибка будет другой, либо её не будет вообще. Т.к. ошибка именно в этих строках. -------------------- Теперь при чем :P |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
не, малость не то... g - какое-то подобие двумерного массива, тока с разной длинной строк, причем нужно динамически удлиннять эти строки.
ну any_action_with_p_or_g(); -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
А для эффективности их еще не по одному элементу желательно удлинять - снова std::vector.
|
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
вектор это конечно хорошо, но т.к. я решаю олимпиадную задачу => <vector.h> подключать низя... =(
нуна все-таки думать самому.... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
тогда определи двумерный массив указателей, если уж собрался два индекса использовать.
-------------------- Теперь при чем :P |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
все... разобрался... c realloc я все делал правильно... я как обычно забыл обнулить kg (не бейте меня сильно, я с паскаля пережжаю... там такое иногда прокатывает =) )
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Так... проблемы продолжаются...
с небольшими m,n,a,b,c.. прога работает на ура, а вот если m=9999 и n=10000 вылетает access violation, при чем не сразу..
Немного поясню что это: Вобщем я решаю задачу: Есть граф с n вершинами и m ребрами, нужно найти кратчайший путь из одной вершины в другую. Оюычнай дейкстра не подходит (по времени) + если просто хранить граф в двумерном массиве (вершины смежные с текущей) - не влазит по памяти. Нужно написать дейкстру с кучей + "извратный" (динамический) массив. Дейкстру с кучей я написал а вот с "извратным" массивом - проблемы.... походу - учу C++ Это сообщение отредактировал(а) BSOD - 9.2.2006, 23:35 -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Только это C без ++ В стиле C++ выделение памяти делается оператором new. К вопросу об access violation: рекомендуется проверять выделилась ли память, примерно так:
-------------------- Теперь при чем :P |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
ну дык эт мона, тока памяти хватает... (еще метров 200 свободно, а надо 64)
и кастати, с new все точно также... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Походу возникает еще один вопрос:
а какой вобще может быть максимальный размер динамического (да и статического) массива (у меня почему-то 10000 на 10000 даже не компилится....) (памяти хватает, т.к. в делфи такой массив нормально создается и работает,а в С - нет ... ) -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
А какой компилятор? На каком-нибудь Borland C++ 3.0 если, то ее столько и нет.
|
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Builder 6.0
Тут вот на одном форуме сказали, что компилятор не может выделить больше 16 мб, но должны быть опции для выделения больше... какие? -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Для MSVC есть ключик /Zm, а для билдера не знаю... Попробуй спросить bcc32 -h -
-------------------- Теперь при чем :P |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
ничего похожего не нашел... и потом мне нужно, что бы типа как в паскале, ключик (типа {$M xxx xxx xxx}) прямо в коде...
мож я че с кодом напортачил.... выложу ка я листинг... может есть че-нить, бросающееся в глаза... (ч то си еще тока учу.. =) )
а вот тестик, на котором не работает... http://leonovich.h14.ru/input.rar помогите плз.. уже который день мучаюсь.. и еще, если без realloc'a сразу выделить памяти по 10000, то еррор уже другой, но тоже непонятно почему.... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
BSOD, у Вас есть как минимум один косяк в Вашей программе - в цикле for, в строках 106-110:
Обратите внимание: массивы g и p у Вас имеют по 10001 элементов, а тело цикла выполняется 10002 раза (поскольку n в Вашем тесте имеет значение 10000)!! И Вы вылезаете за границы массива. Маленький совет: если Вы на Сях в цикле for используете переменную-счетчик в качестве индекса массива, никогда в кач-ве условия не ставьте <=, ставте просто знак <. (Т.е, если размер массива 10001 эл-тов, то индекс должен изменятся в пределах от 0 до 10000, а не от 0 до 10001). Это сообщение отредактировал(а) Lotrex - 15.2.2006, 08:36 |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
исправил - не помогло...
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
В других местах у Вас ничего похожего нет? Остальные for'ы поглядите! Я тож погляжу
|
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Вот тут у Вас еще 2 косяка (по-моему, это строки 111-123 приведенного текста):
Косяк №1 Итак, помним, что g[a] - это массив из kg[a] элементов, следовательно, допустимый диапазон изменения индексов - от 0 до kg[a]-1!! А у Вас что написано? Опять за границы вылезаем... Аналогично с массивом g[b]. Косяк №2 массивы p[a] и p[b] у Вас инициализированы только 1 раз! Я так понимаю, память под них тоже надо функцией realloc перераспределять - первоначально Вы выделили память только под 1 элемент! |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
опа ... вот это косяк так косяк... пасиба... глюк продвинулся гораздо дальше
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Ну как, движение есть?
|
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
хех, опять не работает....
и похоже я опять что-то где-то с памятью упустил... теперь еррор в процедуре swap, причем не сразу, а когда она вызывается из heapify_u.... опять access violation... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
новый код приведи полностью - поковыряем на досуге.
|
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
воть... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Слушай, у меня на работе твой новый вариант не вылетает - до конца доходит. Я еще дома погляжу (там комп послабже)
|
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
на каком тесте, и какой ответ выдает?
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
На том, что ты дал, ответ - 9 девяток.
Если это правильно - давай другой тестик сваргань, позыркаем, что там и как. Дома у меня тоже идет. |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
дык вот 9 девяток - это как раз и не правильно...
странно как-то, алгоритм вроде правильный... на малых тестах то работал правильно... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Если у Вас тесты делаются автоматом - сделайте штуки 3 разных размеров, определимся на каком идет.
А еще лучше - сделайте прогу, которая тесты клепает - на входе ей даешь размер графа (или что там), на выходе - тест и правильный ответ к нему. На Паскале (или Дельфях) - у Вас, насколько я понимаю, там все без проблем получается. Еще маленький советик - сделайте так, что бы в Вашей программе не было глобальных переменных (вообще). Передавайте их в функции как параметры. В сях с этим просто - все пр-ры передаются просто по значению - если передаешь int, то передается значение переменной, если передаешь какой-то указатель (не важно, какой размерности) - передается значение указателя. Внутри функции можете с ними что хотите делать (только free для указателей не вызывайте Это сообщение отредактировал(а) Lotrex - 18.2.2006, 13:41 |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Нет, тесты сами не генерятся, но все-таки пару тестов есть...
http://leonovich.h14.ru/test1.zip http://leonovich.h14.ru/test2.zip http://leonovich.h14.ru/test3.zip воть... На счет указателей - поробую, но не думаю, что поможет... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
То, что я говорил - убрать глобальные переменные - поможет лишь облегчить поиск ошибок, но не убрать сами ошибки. Тесты прогоню, как время будет.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |