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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с масивами, Сдвиги в масивах 
:(
    Опции темы
Falcon(TFSoft)
Дата 31.5.2004, 14:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуте!

Помогите мне пожайлуста порешить такуб проблему:

Есть матрица, к примеру 3х3, надо сделать вот такой сдвиг:
из такого
1 2 3
4 5 6
7 8 9
такой
х 1 2
3 4 5
6 7 8
(х - любое число)
Я конечно понимаю что єто можно сделать испоьзуя 2 цикла и просто переставляя
значения.
Но возмоно ли решить это все просто поменяв каки либо адресса переменных?
Я не разбираюсь в Ассемблере и в пространстве адрессов, так что если это возможно помогите мне, расписав пример более подробно.
С ув. Алексей.
  Вверх
mr.DUDA
Дата 31.5.2004, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Если перед строкой массива память не выделена, то простым смещением указателя на 1 вверх не обойдешься. Придётся переставлять элементы.


--------------------
user posted image
PM MAIL WWW   Вверх
Nastya
Дата 31.5.2004, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

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



Думаю вариат с дополнительным массивом и прочкой memcopy будет не лучшим, чем цилы


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
achmed
Дата 31.5.2004, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



если массив такой:
int a[3][3];

то сдвиг можно сделать так:
// где в начале файла, подключение шаблонов STL
#include <algorithm>
....
// ВОТ ОНО
std::copy_backward(&a[0][0],&a[0][0] + 8,&a[0][0] + 9);

вот, изучайте STL.

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Какие шаблоны? Какой стл? Чтобы сделать подобное не надо ничего никуда подключать. Простой алгоритм...
Код

int pMatrix [3][3] = {1,2,3,4,5,6,7,8,9};
int *i = &pMatrix[2][2];
while (i >= &pMatrix [0][0])
{
       i--;
 *(i+1) = *i;
}
pMatrix [0][0] = 0xFF;

Ну или как Настя предложила, только немного модифицируем её идею:
Код

memcpy (&pMatrix [0][1], &pMatrix[0][0], ((3*3)-1)*sizeof(pMatrix[0][0]));

А вообще, все это сводится к этому:
Код

_asm {
 std
 mov ecx, 8
 lea edi, pMatrix+8*4
 lea esi, pMatrix+7*4
 rep movsd
}



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
achmed
Дата 1.6.2004, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>Какие шаблоны?
шаблоны алгоритмов
>Какой стл? Чтобы сделать подобное не надо ничего никуда подключать. Простой алгоритм...
который реализован в STL , его использование улучшает читаемость кода.

PM MAIL   Вверх
mr.DUDA
Дата 1.6.2004, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



З.Ы. ни один из приведённых примеров не будет работать для динамического массива указателей на одномерные массивы (т.е. для **Arr).


--------------------
user posted image
PM MAIL WWW   Вверх
Baa
Дата 1.6.2004, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



achmed,
Код
std::copy_backward(&a[0][0],&a[0][0] + 8,&a[0][0] + 9);

Читабельность этого - никакая.
Максимальная читабельность с memcpy и с ассемблерным кодом.
Если мы будем для каждого простого алгоритма пользоваться обертками и прочим, то код разрастетется до гигантских масштабов.
Я не противник стл, просто считаю, что подобные простые алгоритмы следует реализовывать самому (в том числе и следует УМЕТЬ реализовывать, а не пользоваться тем, что для нас заготовили). Назовем это практикой ума smile.gif


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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