Форум программистов, компьютерный форум CyberForum.ru

Ссылки - C++

Восстановить пароль Регистрация
 
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
30.11.2010, 15:07     Ссылки #1
Здравствуйте.
Если я задаю матрицу
C++
1
2
3
int **m=new int*[h];
for (int i=0;i<h;i++)
    m[i]=new int[h];
то могу ли я обращаться и производить действия с её столбцами (например, сравнивать на идентичность) через *m[h] (или m*[h] / &m[h] )?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2010, 15:07     Ссылки
Посмотрите здесь:

C++ Ссылки в С++
Ссылки C++
C++ ссылки
C++ ссылки
Ссылки в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2010, 15:12     Ссылки #2
Цитата Сообщение от 4ance Посмотреть сообщение
то могу ли я обращаться и производить действия с её столбцами
А со строками можете?
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
30.11.2010, 15:37  [ТС]     Ссылки #3
Цитата Сообщение от fasked Посмотреть сообщение
А со строками можете?
Ну если со столбцами не могу, то со строками та же история.
Если я создаю матрицу
C++
1
int **m=new int*[h];
**m - создаётся переменная в которой хранится массив массивов int *[h].
Потом в цикле
C++
1
2
for (int i=0;i<h;i++)
    m[i]=new int[h];
указывается количество массивов(внешних) для переменной *m[i].

То есть, если я хочу сравнить столбцы(это уже внутренние массивы - m[i]), то
if ( *m[ i ] == *m[ i + 1 ]) {...}.

Правильно ли это?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2010, 16:43     Ссылки #4
Цитата Сообщение от 4ance Посмотреть сообщение
Правильно ли это?
Нет, неправильно.
Вы немного не понимаете суть массивов в Си. Как такового объекта "массив" в языке не существует. Есть область памяти, в которую последовательно записаны данные одного типа.

То есть массив вида int array[5] - это участок памяти размером 5 * sizeof(int). Это просто область памяти и ничего больше. Следовательно абсолютно неважно каким типом данных ее представлять. То есть я могу создать массив из 5 объектов типа int, а считать из него 20 объектов типа char (при условии что sizeof(int) == 4) && sizeof(char) == 1);

Ну а так как объекта массив не существует, то и сравнивать их нельзя. То есть нельзя писать:
C
1
2
3
4
5
int a[5];
int b[5];
// ...
if(a == b)
//...
Для работы с массивами в языке существуют указатели. Когда массив передается в функцию, то фактически в функцию передается указатель на массив, а если быть еще более точным то указатель на первый элемент массива.
При выделении области памяти динамически (new, malloc, realloc) указателю также присваивается адрес первого элемента массива.

Теперь обогатившись некоторыми знаниями посмотрим на конкретный код, то есть Ваш и то что Вы хотели бы с ним сделать.

C++
1
2
3
int **m=new int*[h]; 
for (int i=0;i<h;i++)
 m[i]=new int[h];
Здесь int **m - это двойной указатель (или указатель на указатель), с помощью операции new int*[h] этому указателю присваивается адрес первого элемента из массива указателей.
далее в цикле, каждому элементу из массива указателей присваивается адрес первой переменной из массива типа int.

Тогда получается, что выражение *m[ i ] == *m[ i + 1 ] будет аналогично выражению m[i][0] == m[i + 1][0]. То есть сравниваться будут только первые элементы i-ой и следующей строки.

Вывод: Сравнивать строки и столбцы надо поэлементно в цикле.
C++
1
2
3
4
5
6
7
bool eq = true;
for(int j = 0; j < h; ++j) {
     if(m[i][j] != m[i+1][j]) {
           eq = false;
           break;
     }
}
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
30.11.2010, 19:46  [ТС]     Ссылки #5
Цитата Сообщение от fasked Посмотреть сообщение
Нет, неправильно.
Вывод: Сравнивать строки и столбцы надо поэлементно в цикле.
C++
1
2
3
4
5
6
7
bool eq = true;
for(int j = 0; j < h; ++j) {
     if(m[i][j] != m[i+1][j]) {
           eq = false;
           break;
     }
}
Спасибо, за лекцию!
Всё-таки, придётся добавлять лишний цикл. А то и 2.

Добавлено через 2 часа 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int matrix[4][4] = { 
{1, 2, 1, 1},
{1, 2, 2, 2},
{1, 2, 3, 3},
{1, 2, 4, 4}
};
 
int main () {
    for ( j = 0; j < 4; j++ ) //Внешний цикл - проход по столбцам
    {
        for ( i = 0; i < 4; i++ ) // Проход по строкам
        {
            if ( matrix[ i ][ j ] == matrix[ i ][ j + 1 ] ) 
            {
                cout << matrix[ i ][ j ] << " ";    
            }
                else break;
        }   
    }
    return 0;
}
Выдаёт 1 2 3 4 1.
На дебаге первую единицу видит при j==2, хотя во втором столбце одни двойки!

Добавлено через 17 минут
Нет, первая единица правильная.
Последнюю единицу записывает потому что matrix[0][3] == matrix[0][0].
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2010, 19:54     Ссылки #6
Цитата Сообщение от 4ance Посмотреть сообщение
matrix[ i ][ j ] == matrix[ i ][ j + 1 ]
В этой строке выход за пределы массива, когда счетчик достигнет максимума, то есть когда j = 3.
Условие в цикле должно быть
C++
1
for(int j = 0; j < 4 -1; ++j)
Yandex
Объявления
30.11.2010, 19:54     Ссылки
Ответ Создать тему
Опции темы

Текущее время: 11:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru