Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2017, 10:59   #1
academeg
Новичок
Джуниор
 
Регистрация: 21.05.2017
Сообщений: 2
По умолчанию Циклический сдвиг элементов массива(С++)

Здравствуйте, подскажите пожалуйста почему в строке
Код:
for(p = &m[0][0]; p != &m[N - 1][M]; p += M)
происходит эта ошибка:
Код:
error: invalid types 'int[const int]' for array subscript
Код:

Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз
(в зависимости от введенного режима), n может быть больше количества элементов в строке или столбце.*/
 
 
#include <iostream>
 
using namespace std;
 
void print_matrix(int m[], int row, int col);
void sdvig (int * m, const int N, const int M);
 
int main(){
    int s;                  //тип сдивга
    int n;                  // индекс сдвига
    const int N = 4;
    const int M = 5;
    int m[N][M] = {
        { 1, 1, 1, 1, 0 },
        { 2, 2, 2, 2, 0 },
        { 3, 3, 3, 3, 0 },
        { 1, 2, 3, 4, 0 }
    };
    print_matrix(&m[0][0], N, M);            //идентификатор макроса
    cout << endl;
    cout << "Vvedide n" << endl <<endl;
    cout << "n = ";
    cin >> n;
    cout << endl << endl;
    cout << "Vvedite 1 - sdvig vpravo, 2 - sdvig vniz" << endl << endl;
    cout << "s = ";
    cin >> s;
    cout << endl;
    sdvig (&m[0][0], N, M);
 
 return 0;
}
 
 
void print_matrix(int m[], int row, int col)
{
    for(int i = 0; i < row; ++i){
        for(int j = 0; j < col; ++j)
            cout << m[i * col + j] << ' ';
        cout << endl;
    }
    cout << endl;
}
 
void sdvig (int *m, const int N, const int M)
{
    int s;                  //тип сдивга
    int n;                  // индекс сдвига
     if(s == 1)
        {
            //сдвиг вправо
            int* p, t;
            for(p = &m[0][0]; p != &m[N - 1][M]; p += M){           //проход построчно
                for(int i = 0; i < n; ++i)
                {                         //кол-во сдвигаемых элементов
                    t = *(p + (M - 1));                             // в  t  присваеваем последний элемент строки
                    for(int* r = p + (M - 1); r > p; --r)           //идем по строке от последнего эл-та к первому
                        *r = *(r - 1);                              //каждому элементу присваевам предыдущий
                    *p = t;                                     //первому эл-ту строки присвоим последий
                }
            }
            print_matrix((int*)m, N, M);
        }
        else
        {
            //сдвиг вниз
            int *p, t;
            int* e = &m[N - 1][0];                              // последний элемент столбца
            for(p = &m[0][0]; p != &m[0][M]; ++p, ++e)
            {         // проход по строке
                for(int i = 0; i < n; ++i)
                {                     // кол-во сдвигаемых элементов
                    t = *e;                                      // в Т отправляем последний элемент столбца
                    for(int* r  = e; r >p; r -= M)             // проходим снизу вверх по столбцу
                        *r = *(r - M);                              // элемнту столбца присваеваем предыдущий
                    *p = t;                                     // на место первого элемента ставим последний
                }
            }
            print_matrix((int*)m, N, M);
        }
}
academeg вне форума Ответить с цитированием
Старый 21.05.2017, 11:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что если
Код:
int *m
то m[i] уже int. Как компилятору индексировать инт?
p51x вне форума Ответить с цитированием
Старый 21.05.2017, 11:28   #3
academeg
Новичок
Джуниор
 
Регистрация: 21.05.2017
Сообщений: 2
По умолчанию

т.е. нужно сделать указатель на указатель или как?
academeg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг элементов массива (TurboPascal) VladKB1 Помощь студентам 3 02.06.2014 22:46
Осуществить циклический сдвиг элементов массива влево на К позиций (Delphi) ALEXandr20333 Помощь студентам 8 13.02.2014 23:04
циклический сдвиг элементов массива Carter Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2011 19:54
Описать процедуру,осуществляющую циклический сдвиг элементов массива на k позиций Bloodpoisoning Общие вопросы C/C++ 0 29.11.2010 15:50