| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > можно ли в программе задавать любой объем |
| Автор: PandaRus 27.12.2006, 12:17 |
| Добный день. Одной из составных частей моего диплома является расчет распределения токов в теле человека между электродами. Пишу в Visual C++. Вообще вперые в С++. Столкнулся с проблемой, что как только объем обьявленных переменных превысит где-то 1.5Мб программа перестает работать. Программа использут для расчета матрицу проводимостей - требуется массив около 65000х65000 (что соответствует телу, разбитому на 100х25х25 точек). Очень жаль при объеме ОЗУ в Гб получить от программы 1Мб. Подскажите, можно ли в программе задавать любой объем используемой памяти. С уважением, Иван. Срочно. |
| Автор: JackYF 27.12.2006, 12:21 |
| У тебя объявление статическое? Тогда увеличь максмальный размер стека (должно быть в настройках проекта). Если динамическое, то такого быть не должно и код на выкладку. |
| Автор: PandaRus 27.12.2006, 17:55 | ||
| Насчет объявления - не знаю. Как запустил программу - инчего не менял. В тулсах>опции вроде все облазил - что-то про память не нашел. От текса моей программы не зависит, так как не работает даже такая голая программа:
При запуске появляется стандартное окно Винды об ошибке о том, что в моем "..." .exe обнаружена ошибка. У меня Visual6.0. Может попробовать на другом компе или например на Байсике? |
| Автор: JackYF 27.12.2006, 18:02 | ||
Ты пытаешься в стеке выделять sizeof(float) * 1000 * 1000 = ~4Мб памяти! Статически. По умолчания программа не имеет столько большого стека! Выделяй это дело динамически. Как - поиск по форуму, тема поднималась не раз - "Динамическое выделение памяти". Добавлено @ 18:04
А вообще место 1000 лучше использовать целые константы. |
| Автор: Любитель 27.12.2006, 18:23 |
| Про делит надо было бы напомнить, а то многие начинающие забывают. |
| Автор: JackYF 27.12.2006, 18:31 | ||
| Не вопрос: напоминаю: в конце использования данной памяти ее очень желательно освободить:
|
| Автор: PandaRus 27.12.2006, 19:13 | ||
| Большое спасибо за оперативность А если выделять память под B=XxYxZ то будет так?:
|
| Автор: Любитель 27.12.2006, 19:19 | ||
Нет. Трёхмерный массив - это массив из двумерных массивов. Типа такого:
Аналогично удаление. А ты уверен, что тебя трёхмерный массив, нужен кстати. Может стоит посмотреть в сторону каких-нибудь математических библиотек (с хорошей оптимизацией)? |
| Автор: PandaRus 27.12.2006, 19:36 |
| Трехмерные массивы только для ввода/вывода характеристик тела (матрицы: потенциалов[x][y][z] в точках и проводимостей между этими точками). Под них память выделять не буду - и так хватит. Но вот для расчетов потребуется гигантская матрица проводимостей G=[x*y*z][x*y*z]- по расчетам уйдет около 250 метров. В основе решения - метод узловых потенциалов - результат получается очень быстро (для больших массивов) при использовании к G метода Гаусса. Пока правда программа работает в плоскости, предстаит добавление еще одной координаты Z. Предчувсвую кипени мозгов при составлении G. |
| Автор: MINI_PROGRAMMER 28.12.2006, 22:47 |
| Товарищи! Программирую Windows-окна. Недавно узнал про PlaySound, создал програмку, скомпилировал. ОШИБКА! [Linker error] undefined reference to `PlaySoundA@12' . Подскажите, в чём дело! Работаю в Dev-C++ v. 4.9.9.2 |
| Автор: JackYF 28.12.2006, 22:59 |
| Подключи к проекту winmm.lib |
| Автор: MINI_PROGRAMMER 29.12.2006, 13:52 |
| Thank you! |
| Автор: PandaRus 15.1.2007, 20:43 | ||
| Добрый день. Подскажите в чем проблема? Вариант для поверхности работает, а что здесь - не знаю. Программа немного недоработана по алгоритму, но ошибка не в этом - просто не компилируется.
P.S. Как-то уж очень нецеремонно влезли... |
| Автор: JackYF 15.1.2007, 20:48 |
| Во-первых, следовало бы создать новую тему... Во-вторых, телепаты в отпуске надолго, ты б сказал, что ли, в каких строках ошибки, мы ж не компиляторы все-таки. |
| Автор: PandaRus 15.1.2007, 21:06 | ||
Действительно, программа показала что ошибка в 76 строке - деление на 0. Оказалось, что r=0, хотя в 31 строке r=30 и больше вроде не меняется. Хорошо, в след. раз буду создавать новые темы. P.S. И в каком разделе мне задавать вопросы типа "Как мне создавать и решать матрицы проводимостей для объектов размеров около 10000*1000*1000 узлов - никакой оп.памяти не хватит?"; "Где и как мне можно нарисовать объект, чтобы он автоматически мог затем рассчитываться в будущей моей программе?" |
| Автор: sergejzr 15.1.2007, 21:14 |
| Модератор: Название темы должно отражать ее суть! |
| Автор: PandaRus 15.1.2007, 21:23 |
| ОК. Извените. Сегодня ночью тема будет закрыта. Только ответ получу на последние вопросы. Чтобы лишние темы не создавать. |
| Автор: PandaRus 15.1.2007, 21:53 |
| После того, как подставил r=30 перед самим вычислением, программа запнулась на 87 строке - ошибка "нарушение доступа" |
| Автор: JackYF 16.1.2007, 16:11 |
| Проверь границы массивов - у тебя там куча вложенных циклов, проверь выход индексов за рамки массива. |