Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сдвиг двумерного массива. 
V
    Опции темы
Santa12
Дата 4.6.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



О! Не знал что динамический и статический хранятся в памяти по разному! Спасибо! Буду знать. Видимо, или не попалось мне это в книгах/статьях, или не придал этому значения. Потому и не акцентировал внимание, что в приведенном примере был статический массив.

Цитата(fry @  4.6.2009,  15:44 Найти цитируемый пост)
Т.е. "не наигралсо".


есть такое ;)

Цитата(fry @  4.6.2009,  15:44 Найти цитируемый пост)
Еще лучьше поставить более менее реальную задачу и ее решить


Есть такая. Но она мне пока не по плечу ) сделал лишь половину, и решил сперва сначала с базовыми вещами разобраться... Вот, разбираюсь... Еще бы со списками понять работу )

Цитата(mes @  4.6.2009,  15:52 Найти цитируемый пост)
Динамические многомерные массивы представлены многоуровнево, т.е 2х мерный массив является массивом указателей на одномерные массивы, которые могут лежать в произвольных местах памяти. 


Заучил. Теперь не забуду.


PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



mes, незаметил объявление, смотрел на работу (2 цикла по индексам) с массивом. Извини за поклеп. 

ЗЫ Нах автор второго варианта делал с 2 циклами если лучше с одним?! (только, чтобы показать "как правильно", но это ему тоже до конца не удалось)
Все еще думаю что в этом случае(в случае автора темы) лучше динамика с линейным расположением элементов т.к. проще и быстрее.

Добавлено через 4 минуты и 28 секунд
Santa12, имей ввиду, что хранение динамического массива частями (2мерного) далеко не является рациональным решением т.к. заведомо менее производительно и несколько менее, но все же расточительнее.
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(fry @  4.6.2009,  17:06 Найти цитируемый пост)
имей ввиду, что хранение динамического массива частями (2мерного) далеко не является рациональным решением т.к. заведомо менее производительно и несколько менее, но все же расточительнее.


Учту. Но, я правильно понимаю, что к статическому это замечание не относится?

Жаль, никому не могу поставить плюсы. Исправлюсь, как только наберу сотню постов ;)

PM MAIL WWW ICQ   Вверх
azesmcar
Дата 4.6.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Santa12 @  4.6.2009,  17:32 Найти цитируемый пост)
Жаль, никому не могу поставить плюсы. Исправлюсь, как только наберу сотню постов ;)

поставил.
PM   Вверх
Santa12
Дата 4.6.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  4.6.2009,  17:34 Найти цитируемый пост)
поставил


Благодарю.
PM MAIL WWW ICQ   Вверх
mes
Дата 4.6.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Santa12 @  4.6.2009,  16:04 Найти цитируемый пост)
Заучил. Теперь не забуду.

только при запоминании, делайте акцент не на статичность, и динамичность, а на способ выделения памяти под массив.
потому как в этом примере динамический массив (хотя динамично только одно его направление) будет располагаться в памяти линейно :
Код

int (*mas)[20];

int main()
{

int n=10;
mas = new int[n][20];

for (int i=0; i<n; ++ i)
for (int j=0; j<20; ++j) mas[i][j] = i*20+j; // заполняем в два цикла

for (int i=0; i<n*20; ++ i) std::cout << mas[0][i] << " "; // и линейно выводим для проверки.

   return 0;
}



Цитата(fry @  4.6.2009,  16:06 Найти цитируемый пост)
Santa12, имей ввиду, что хранение динамического массива частями (2мерного) далеко не является рациональным решением т.к. заведомо менее производительно и несколько менее, но все же расточительнее. 

это высказывание требует слишком много оговорок,  и в принципе справедливо лишь к "излишнe" занимаемой  памяти.



--------------------
PM MAIL WWW   Вверх
fry
Дата 4.6.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Santa12, если массив не динамический (статический), то он просто выделяется в стеке в виде линейно упорядоченных элементов,т.е. то, что я описал, только в стеке. Если выделять динамически (предложенный мной вариант), то есть два варианта: 
1. выделить также линейно
2. выделить сначала массив указателей, а затем каждый элемент этого массива проинициализировать своей частью памяти.

В первом варианте все элементы располагаются рядом. К ним обращение будет происходить без лишних операций со стороны операционной сис-мы(ОС).
Во втором возможно падение производительности т.к. ОС не гарантирует что выделенная память будет располагаться за памятью выделенной ранее, что потребует некоторых манипульций со стороны ОС в случае обращения к элементам. К тому же код твоей программы во втором варианте будит несколько днлинее, чем во втором (сложнее будет код  выделения массива, высвобождения массиваб работы с массивом).

Цитата

это высказывание требует слишком много оговорок


посмотри на код в постах выше и прикинь код в случае линейного расположения элементов. Вложенности циклов не будет. Проявятся возможности ОС по части кэширования. Проще код, меньше жрет памяти, думаю, что прога возможно будет по размеру меньше (критично в некоторых местах(контроллеры и т.п.)).

ЗЫ ты в своем посте проверку на невозможность выделения забыл.

Это сообщение отредактировал(а) fry - 4.6.2009, 18:09
PM MAIL   Вверх
mes
Дата 4.6.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(fry @  4.6.2009,  17:01 Найти цитируемый пост)
посмотри на код в постах выше и прикинь код 

если это высказывание относится только применительно к конкретному коду, то спорить не буду (см. код лень).
Однако для общего случая высказывание не корректно. 


--------------------
PM MAIL WWW   Вверх
fry
Дата 4.6.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Цитата

Цитата(fry @  4.6.2009,  17:01 Найти цитируемый пост)
посмотри на код в постах выше и прикинь код 

если это высказывание относится только применительно к конкретному коду, то спорить не буду (см. код лень).
Однако для общего случая высказывание не корректно. 


По какой из частей моего суждения некорректно?
PM MAIL   Вверх
mes
Дата 4.6.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

По какой из частей моего суждения некорректно?

В том что линейное раположение строк эффективнее в производительности  при работе с матрицей, чем не линейное.
Речь идет об одном и том же решении примененного к статическому и динамическому массиву.
Если решение конкретной задачи приведено к линейному виду, то естественно у него будет преимущество.


это обсуждалось в частности здесь : http://forum.vingrad.ru/forum/topic-249780...tml#st_0_view_0

Это сообщение отредактировал(а) mes - 4.6.2009, 18:19


--------------------
PM MAIL WWW   Вверх
Santa12
Дата 4.6.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Так... я создаю динамический массив вот таким образом:

Код

    //создаем двумерный массив по полученным данным
    int **mass = new int*[max_n];
    for(i = 0; i < max_n; i++)
    {
        mass[i] = new int[max_m];
    }//for(i = 0; i < max_n; i++)



mes,  т .е. в отличие от приведенного вами варианта, он будет располагаться в памяти не линейно? Я правильно понимаю?


fry, а можно немножко пояснить: КАК задать массив линейно? И как выглядит код первого, а как второго вариантов?

Приношу свои извинения за назойливость, просто я пока все не "разжую" мне сложно понять что имеется в виду... Если вместо ответа будут ссылки на статьи/книги - тоже буду рад )
PM MAIL WWW ICQ   Вверх
mes
Дата 4.6.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Santa12 @  4.6.2009,  17:18 Найти цитируемый пост)
 т .е. в отличие от приведенного вами варианта, он будет располагаться в памяти не линейно? Я правильно понимаю?

правильно, так как выделяете память кусками. 
хотя это относится к целевому  массиву. А вот вспомогательные массивы (строки и массив указателей на строки) располагается линейно. 



Это сообщение отредактировал(а) mes - 4.6.2009, 18:24


--------------------
PM MAIL WWW   Вверх
fry
Дата 4.6.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Там нет технологии тестирования, это раз, в данном случае не надо будет вычислять смещение по двум индексам это два. По части всего остального остаюсь при своем. 

Кстати
Цитата

Код

mas = new int[n][20]


Данная строчка будет не так красиво смотреться при добавнеии обработки исключений. Хотя конечно строчка красивая.

mes, при всем уважении
Цитата

правильно, так как выделяете память кусками. 

Это не совсем правильно

Это сообщение отредактировал(а) fry - 4.6.2009, 18:23
PM MAIL   Вверх
mes
Дата 4.6.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(fry @  4.6.2009,  17:22 Найти цитируемый пост)
Код

так как выделяете память кусками. 

Это не совсем правильно

Согласен, но, думаю, так тс легче будет понять когда массив линейный, а когда нет.  smile 


Это сообщение отредактировал(а) mes - 4.6.2009, 18:26


--------------------
PM MAIL WWW   Вверх
fry
Дата 4.6.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Цитата

fry, а можно немножко пояснить: КАК задать массив линейно? И как выглядит код первого, а как второго вариантов?


Код

int *arr= new int[n*m]; <- линейный вариант

см. mes'а <- нелинейный вариант

int (*mas)[20];
mas = new int[n][20];


Это сообщение отредактировал(а) fry - 4.6.2009, 18:28
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.