Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблемы с масивами


Автор: Falcon(TFSoft) 31.5.2004, 14:16
Здравствуте!

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

Есть матрица, к примеру 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
Если перед строкой массива память не выделена, то простым смещением указателя на 1 вверх не обойдешься. Придётся переставлять элементы.

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

Автор: achmed 31.5.2004, 18:31
если массив такой:
int a[3][3];

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

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

Автор: Baa 1.6.2004, 01:34
Какие шаблоны? Какой стл? Чтобы сделать подобное не надо ничего никуда подключать. Простой алгоритм...
Код

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
}

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

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

Автор: Baa 1.6.2004, 13:52
achmed,
Код
std::copy_backward(&a[0][0],&a[0][0] + 8,&a[0][0] + 9);

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)