Название: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 17:24 Есть масиви u[1000][1000] и E[1000][1000] как можно увеличить количестко строк и столбцов в 10 раз, а то в Qt не хватает памяти?
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: niXman от Апрель 06, 2010, 17:30 Qt тут не при чем. вы пытаетесь выделить память на стеке :)
для подобных целей есть std::vector<>, std::list<>, QVector<>, QList<> ну и на худой конец, динамическая память. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 17:34 как увеличить виделения динамической памяти?
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: SimpleSunny от Апрель 06, 2010, 17:45 Использовать new.
Код
Удалять в обратном порядке. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: niXman от Апрель 06, 2010, 17:49 SimpleSunny, вот расскажите, нафига такой изврат, когда есть контейнеры? ;)
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Karl-Philipp от Апрель 06, 2010, 18:17 SimpleSunny, вот расскажите, нафига такой изврат, когда есть контейнеры? ;) Встречал я где-то в Интернете, что контейнеры (vector, list и т.д.) хорошо справляются с количеством объектов до 100.000 штук (ориентировочно). Дальше, по идее, скорость обработки объектов будет (может) падать.Возможно, поэтому Ubuntu_linux хочет решить свой вопрос с помощью массивов. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 06, 2010, 18:20 Еще накладных расходов избегаем!
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Karl-Philipp от Апрель 06, 2010, 18:25 Еще накладных расходов избегаем! переведите, пожалуйста ;)Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Amigo_sa от Апрель 06, 2010, 18:26 Использовать new. Код
Удалять в обратном порядке. Насколько я понял, для динамических двумерных массивов лучше так не выделять память. new - тяжелая операция и удалять потом объекты трудно. Лучше выделить сразу matr = new int* [nrow * ncol] . и потом аккуратно работать с индексами Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 06, 2010, 18:46 Была ситуация, когда хранил двумерный массив Qt-ыми средствами. Размер большой! В рез-те требовалось много оперативки! Стал использовать обычное динамическое выделение памяти - размер занятой оперативки уменьшился значительно! Хотя если размеры небольшие конечно лучше использовать стандартные контейнеры ;)
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: zenden от Апрель 06, 2010, 18:50 лучше купить побольше памяти и не париться ::) копейки стоит ведь
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Karl-Philipp от Апрель 06, 2010, 19:25 лучше купить побольше памяти и не париться ::) копейки стоит ведь а что делать, если программа пишется для продажи? Не говорть же покупателям, что нужно докупать оперативу :)Название: Re: максимальное количество елементов в двумерном масиве Отправлено: pastor от Апрель 06, 2010, 19:33 лучше купить побольше памяти и не париться ::) копейки стоит ведь Что делать в случае эмбеддед девайсов? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Vass от Апрель 06, 2010, 19:45 а что делать, если программа пишется для продажи? Не говорть же покупателям, что нужно докупать оперативу :) Ну не знаю, производители игр и Мелкософт, по-моему, так и делают %) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 19:53 Использовать new. Код
Удалять в обратном порядке. А как обращаться к елементам масива ? например u[10][1000]? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: umts от Апрель 06, 2010, 20:45 Может, изменить алгоритм на менее требовательный к памяти? В большинстве случаев необходимости в таких огромных массивах нет.
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 21:15 Как раз мне надо ,пока что, два массива 1000*1000 (и больше) для более точного решения системы уравнений в частных производных, Но я не могу создать массивы больше 1000*1000 так как стек исчерпывается. :o
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 06, 2010, 21:34 Как раз мне надо ,пока что, два массива 1000*1000 (и больше) для более точного решения системы уравнений в частных производных, Но я не могу создать массивы больше 1000*1000 так как стек исчерпывается. :o Динамически выделяй память!Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 22:04 Я не могу понять как мне выделить память для 2-мерного массива і как потом к нему обращаться.
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: pastor от Апрель 06, 2010, 22:11 Я не могу понять как мне выделить память для 2-мерного массива і как потом к нему обращаться. В теме уже прозвачало 2 ответа (читай на первой странице) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 22:17 при помощи оператора new , ето я понял, но как мне узнать (или записать)значения элемента [55][45] ?
Код: int **mtrx,**matr; Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 06, 2010, 22:32 при помощи оператора new , ето я понял, но как мне узнать (или записать)значения элемента [55][45] ? Код: int **mtrx,**matr; Код: mtrx[55][45] Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 06, 2010, 22:35 Кстати правильно:
Код: int **mtrx = new int* [100]; Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 06, 2010, 23:17 Все получилось, слава Богу!
Теперь максимальное количество элементов на два массива 2*(14000*14000) ~4 миллиона элементов. Мне хватит. Спасибо всем! ;) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Igors от Апрель 07, 2010, 04:20 Насколько я понял, для динамических двумерных массивов лучше так не выделять память. new - тяжелая операция и удалять потом объекты трудно. Лучше выделить сразу matr = new int* [nrow * ncol] . и потом аккуратно работать с индексами Нет, при хороших размерах нужно выделять как указал SimpleSunny, иначе можно нарваться на отказ new и/или убить скорость. Если надо удалять/вставлять - тогда лучше контейнер, но совсем не каждый здесь подойдет. Я бы делал QList <QVector <int>>Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 09, 2010, 17:38 Все получилось, слава Богу! Сорри, тут ошибочка вышла всего элементов выходит 392 миллиона (~ 400 миллионов) , а если тип чисел double (8 байт) то получатся что массив занимает 3.1 Гб памяти.Теперь максимальное количество элементов на два массива 2*(14000*14000) ~4 миллиона элементов. Мне хватит. Спасибо всем! ;) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 09, 2010, 22:07 float не устоит?
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: niXman от Апрель 09, 2010, 22:37 Ubuntu_linux, я уверен на 99%, что вашу задачу можно решить правильным способом, без экстремальной потребности в памяти :)
а иначе, как вам раньше уже рекомендовали, купите памяти ;) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Karl-Philipp от Апрель 10, 2010, 09:07 Ubuntu_linux, я уверен на 99%, что вашу задачу можно решить правильным способом, без экстремальной потребности в памяти :) Уточни-ка, пожалуйста, что это за правльный способ "без экстремальной потребности в памяти"?а иначе, как вам раньше уже рекомендовали, купите памяти ;) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: niXman от Апрель 10, 2010, 09:45 т.к. ТС так и не описал алгоритма, требующего такого огромного, одновременно инициализированного кол-ва элементов, точный "прием" решающий его проблему, указать сложно.
но базовое направление, это "Отложенная инициализация". Тут нашел некоторое, весьма не плохое, решение: http://butaji.wordpress.com/2009/01/02/lazy-computation-in-c-%D0%BB%D0%B5%D0%BD%D0%B8%D0%B2%D1%8B%D0%B5-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-c/ кстати, совсем недавно, для сериализации объектов, инициализируемых данными с ФС(порядка 14 Гб), использовал этот же принцип. доволен как слон :) при том, этот способ, легко позволяет распаралелить(кластеризовать) алгоритм, для повышения производительности. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: alexman от Апрель 10, 2010, 10:37 Разделяй и властвуй ;D
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 00:58 Вот сделал истчо и так для a[10][10]:
Код
Но возникла проблемка! Когда пишеш это в заголовочном файле, то система ругается. Цитировать matrix3diagonal.h:19: error: expected identifier before numeric constant Как это обойти? :oНазвание: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 01:08 Цитировать Но возникла проблемка! Не писать это в заголовочном файле))Когда пишеш это в заголовочном файле, то система ругается. Цитировать matrix3diagonal.h:19: error: expected identifier before numeric constant Как это обойти? Ну или на худой конец можно так: static QVector <QVector <double> > a(10,QVector <double>(10)); На сколько я понял, Вы решаете двумерную краевую задачу.. Можно подробней? Алгоритм опишите, плз) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 12:59 Дело в том, что так не получается, если сделать static. Компилятор начинает жаловаться когда во время декларирования появляется "(100). Проблему получилось обойти другим методом, а именно декларируем в matrix3diagonal.h так
Код а затем в matrix3diagonal.cpp в функции matrix3diagonal () Код
Также нашел другой метод, но так у меня не получается (уже получаєтся), надо просто удалить с matrix3diagonal.cpp функцию которая там по дефолту matrix3diagonal () {} Код а также так: Код Но вылез новый баг, далее расскажу подробнее. Алгоритм, там нет ничего секретного, все делается по стандартному. Я переписываю уравнения в частных производных в разносное уравнения, а затем решаю это уравнение. Нужно подробно? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 13:39 Цитировать Дело в том, что так не получается, если сделать static. Компилятор начинает жаловаться когда во время декларирования появляется "(100). Что у Вас за компилятор? У меня всё работает.. (исходники приатачены) Хотя так делать, действительно, не стоит - заголовочный файл: он на то и заголовочный))Цитировать Алгоритм, там нет ничего секретного, все делается по стандартному. Я переписываю уравнения в частных производных в разносное уравнения, а затем решаю это уравнение. Нужно подробно? Ясненько) И большая там у вас сетка получается? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 14:12 Получается какая-понятка, Вы не создавали класс в заголовочному файле, а если поместить объявление вектора в середину класса, то компилятор ругается.
Но у меня появился другой баг, у меня матрица не хочет выводиться второй раз (после решения), причем программа не ругается, но матрицу второй раз не выводит. Сетка получается 1000 * 1000 при средней точности. К тому же так называемая "явная" схема не дает требуемой точности для моих уравнений, поэтому мне нужно использовать "не явную" схему т.е. по ходу решения решать систему из N алгебраических уравнений, там получается трех диагональная матрица, которую я решаю методом прогонки. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 14:20 А еще я не могу понять, почему у меня в консоль ничего не выводится, хотя она запускается. У меня QT под линукс. ???
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 14:43 Цитировать Вы не создавали класс в заголовочному файле, а если поместить объявление вектора в середину класса, то компилятор ругается. Вот создал в классе)) Никто не ругается)) (исходники приатачены) (Тока не вздумайте ентот изврат использовать в программе)Цитировать Но у меня появился другой баг, у меня матрица не хочет выводиться второй раз (после решения), причем программа не ругается, но матрицу второй раз не выводит. Ну я не телепат, не знаю что вы там понаписали) Исходники выложите..Цитировать А еще я не могу понять, почему у меня в консоль ничего не выводится, хотя она запускается. У меня QT под линукс А вы как программу запускаете?Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 15:55 вот исходники (ниже):
Если поставить вместо Q-векторов, просто матрицу a[100][100] то все работает нормально, а если поставить векторы, то матрица после ришения не выводится. ??? консоль сама запускается, если выполняешь программу в QT, хотя когда пойти в папку с программой и попробовать запустить программу, то ничего не получается, даже никак не реагирует. Так сделать так как вы предложили не получается, вылезает ошибка "multiple definition of` matrix3diagonal:: _row '"хотя вроде все правельно ??? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 16:07 Цитировать консоль сама запускается, если выполняешь программу в QT, хотя когда пойти в папку с программой и попробовать запустить программу, то ничего не получается, даже никак не реагирует. Ахахаа)) Реагирует, можете убедиться в этом посмотрев в системном мониторинге (ну или как он у вас там называется) Прога Ваша загружается на самом деле и выполняется.. Вы наверно её "мышкой" запускали) Попробуйте так: (у вас, разумеется, путь и название другое будет)Код
Пойду взгляну на ваши исходники) Мне, кстати тож скоро нужно будет писать что-то подобное, но я склоняюсь к функциям Грина.. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 16:19 Цитировать консоль сама запускается, если выполняешь программу в QT, хотя когда пойти в папку с программой и попробовать запустить программу, то ничего не получается, даже никак не реагирует. Ахахаа)) Реагирует, можете убедиться в этом посмотрев в системном мониторинге (ну или как он у вас там называется) Прога Ваша загружается на самом деле и выполняется.. Вы наверно её "мышкой" запускали) Попробуйте так: (у вас, разумеется, путь и название другое будет)Код
Пойду взгляну на ваши исходники) Мне, кстати тож скоро нужно будет писать что-то подобное, но я склоняюсь к функциям Грина.. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 16:28 Ох Майн гот!
Вам повезло, что niXman Ваших исходников не видел) Я же Вам говорил не используйте тот приём что я приводил (со статическими членами).. Цитировать Кстати в исходниках, реализация метода прогонки, а не решения PDE. Ну я уж понял)Сейчас покажу, как бы я сделал эту хрень)) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 16:33 Ох Майн гот! так я просто для пробы ;DВам повезло, что niXman Ваших исходников не видел) Я же Вам говорил не используйте тот приём что я приводил (со статическими членами).. Цитировать Кстати в исходниках, реализация метода прогонки, а не решения PDE. Ну я уж понял)Сейчас покажу, как бы я сделал эту хрень)) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 18:32 А я тем временем нашел ошибку, которая приводила к не выполнению части кода с использованием QVector, хотя если использовать обычные массивы, то проблемы не было, как я уже говорил.
Суть проблемы заключалась как всегда в "1", а именно в части кода: Код надо в цикле вместо i>-1 поставить i>0 робочий исходник: Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 18:50 Интересно посмотреть на вашу реализацию ???
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 19:16 Цитировать Интересно посмотреть на вашу реализацию Не вопрос) diagonalmatrix.h Код
diagonalmatrix.cpp Код
А вот так енто используется: main.cpp Код
Разумеется здесь: Код
Нужно всегда проверять это условие.. Во-вторых может в принципе оказаться, что система ваша не совместна.. Вообще, на мой взгляд нужно в public секции класса добавить что-то вроде: Код и следовательно передовать вместо указателя на bool, указатель на State.. типа так: Код
так было бы информативнее.. А вообще уже есть готовая библиотека, работающая с матрицами.. Где-то на форуме тема проскальзывала) Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 19:17 Млин, забыл исходники прикрутить))
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 20:22 Цитировать А вообще уже есть готовая библиотека, работающая с матрицами.. Где-то на форуме тема проскальзывала) Ну вообще то мне нужен только метод прогонки для матриц. И если сделаешь сам, то можно сделать как захочешь и как тебе будет удобнее. ;)Название: Re: максимальное количество елементов в двумерном масиве Отправлено: m_ax от Апрель 29, 2010, 20:38 Цитировать Ну вообще то мне нужен только метод прогонки для матриц Что вы понимаете под прогонкой матриц? Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Апрель 29, 2010, 20:55 тут все сказано вот (http://ru.wikipedia.org/wiki/Трёхдиагональная_матрица)
;)спасибо за помощь! ;) если что то обращайтесь. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Sancho_s_rancho от Май 03, 2010, 21:27 На тему динамического двумерного массива могу предложить это.
Двумерный шаблонный массив с ресайзом через qMalloc/qRealloc. В большинстве случаев достаточно. Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Май 05, 2010, 19:16 ???
Возник еще один вопрос, я в свой класс MainWindow добавил еще диалоговый класс Dialog. Но мне нужно обращаться к переменным которые определены в главном классе MainWindow. В классе Dialog я делаю так: Код но система ругается, Цитировать terminate called after throwing an instance of 'std::bad_alloc' что мне сделать?what(): std::bad_alloc Название: Re: максимальное количество елементов в двумерном масиве Отправлено: KuZ от Май 05, 2010, 21:16 ((MainWindow*)sender())-> вроде так должно пойти и если не ошибаюсь есть еще метод parent.
Название: Re: максимальное количество елементов в двумерном масиве Отправлено: Ubuntu_linux от Май 05, 2010, 22:39 Спасибо!
Я обдумал и решил пойти другим путем, то есть я из класса Dialog вытягиваю все флаги и переменные, а потом обрабатываю с помощью их нужны мне функции в главном классе Mainwindow. |