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

Преобразование нединамического двумерного массива через указатели - C++

Восстановить пароль Регистрация
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
20.11.2014, 19:25     Преобразование нединамического двумерного массива через указатели #1
Здравствуйте. Почему эта программа крашится?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    int i,j, A[4][5], d, s=0, n[4]={1,2,3,4}, **p = A, *f = n;
    for(i=0;i<4;i++)
        {
        for(j=0;j<5;j++)
        {
            *(*(p+i)+j)=(rand()%20)-10;
            d = fabs(*(*(p+i)+j));
            if((j+1)==d)
            {
                s++;
            }
        }
        printf("For line %d number of elements that matched is = %d\n", *(f+i),s);
        }
        
return(0);
}
а эта работает правильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    int i,j, A[4][5], d, s=0, n[4]={1,2,3,4}, *p = A, *f = n;
    for(i=0;i<4;i++)
        {
        for(j=0;j<5;j++)
        {
            *(p+i+j)=(rand()%20)-10;
            d = fabs(*(p+i+j));
            if((j+1)==d)
            {
                s++;
            }
        }
        printf("For line %d number of elements that matched is = %d\n", *(f+i),s);
        }
        
return(0);
}
Разница между ними в том, что ,p, в первом варианте - указатель на указатель на инт, а во втором - просто указатель на инт.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 19:25     Преобразование нединамического двумерного массива через указатели
Посмотрите здесь:

C++ Преобразование двумерного массива.Подскажите пжл!
Передача двумерного массива через указатели C++
C++ Преобразование двумерного массива
Преобразование двумерного массива C++
Преобразование двумерного массива в одномерный C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1863 / 1659 / 578
Регистрация: 14.05.2014
Сообщений: 4,770
Записей в блоге: 1
Завершенные тесты: 5
20.11.2014, 19:36     Преобразование нединамического двумерного массива через указатели #2
Цитата Сообщение от anubis1768 Посмотреть сообщение
работает правильно?
Цитата Сообщение от anubis1768 Посмотреть сообщение
*(p+i+j)=(rand()%20)-10;
Не уверен. если i = 0, а j = 1, или i = 1, а j = 0 и другие подобные варианты, то обращение происходит к одному и тому же элементу.
C++
1
*(p+i*4+j)=(rand()%20)-10;
Добавлено через 2 минуты
Цитата Сообщение от anubis1768 Посмотреть сообщение
указатель на указатель
не есть двумерный массив.
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
20.11.2014, 19:42  [ТС]     Преобразование нединамического двумерного массива через указатели #3
То есть такой код
C++
1
2
3
data arr[5][4];
data** ptr = arr;
*(*(ptr + 2) + 3) = 5;
По Вашему не правильный? Как же тогда индексировать в первом варианте и почему указатель на один int может указывать на int[][]?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
20.11.2014, 20:20     Преобразование нединамического двумерного массива через указатели #4
Цитата Сообщение от anubis1768 Посмотреть сообщение
Почему эта программа крашится?
Что значит "крашится"? Эта программа не будет даже компилироваться. В инициализации '**p = A' - несоответствие типов.

Цитата Сообщение от anubis1768 Посмотреть сообщение
а эта работает правильно?
Вы опять выдумываете. Опять несоответствие типов в инициализации '*p = A'. Программа не компилируема. Какое еще "работает правильно"?

Что за компилятор вы пытаетесь использовать и где вы его откопали?

Массив 'int A[4][5]' при приведении к указательному типу превращается в 'int (*)[5]'. Т.е. вот такой код легален

C++
1
2
int A[4][5];
int (*p)[5] = A;
А то, что у вас написано - сплошные ошибки.
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 787
Завершенные тесты: 2
20.11.2014, 20:26     Преобразование нединамического двумерного массива через указатели #5
C++
1
data arr[I][J];
не есть двумерный массив, это одномерный массив размером I*J.
Такой записью его можно создать только на стеке, либо же в глобальной области памяти и с константным размером -> компилятор предоставляет синтаксическую плюшку для доступа к элементам превращая arr[i][j] в *(arr+i*J+j).

Ваши оба алгоритма неверны, в первом случае, вы разыменовываете не указатель а значение массива и выходите за пределы вашей памяти.
Во втором случае, вы перебираете только 9 элементов, а не 20.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
20.11.2014, 20:40     Преобразование нединамического двумерного массива через указатели #6
Цитата Сообщение от anubis1768 Посмотреть сообщение
То есть такой код
C++
1
2
3
data arr[5][4];
data** ptr = arr;
*(*(ptr + 2) + 3) = 5;
По Вашему не правильный?
Разумеется, не правильный. Это даже не скомпилируется из-за грубейшего несоответствия типов в 'data** ptr = arr;'

Цитата Сообщение от anubis1768 Посмотреть сообщение
почему указатель на один int может указывать на int[][]?
Не может. Чтобы заставить "обычный" указатель 'int *' указывать на 'int [][]' нуджно будет силой приводить тип к 'int *' через 'reinterpret_cast'. Без этого - даже не скомпилируется.

Цитата Сообщение от anubis1768 Посмотреть сообщение
Как же тогда индексировать в первом варианте и
Это зависит от того, чего вы хотите добиться. Мне вообще в упор не понятны цели ваших манипуляций, поэтому советовать тут что-то трудно. Работать с двухмерным встроенным массивом через указатель можно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int i, j, A[4][5], (*p)[5] = A;
 
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            *(*(p + i) + j) = rand() % 20;
        }
    }
}
Но то ли это, что вам нужно - я не знаю.

Добавлено через 3 минуты
Цитата Сообщение от Nosey Посмотреть сообщение
C++
1
data arr[I][J];
не есть двумерный массив, это одномерный массив размером I*J.
С точки зрения физического представления данных в памяти - да, совершенно верно. Но на уровне языка переинтерпретация двумерного массива как одномерного формально запрещена. Т.е. например, некая отладочная реализация имеет право отлавливать выход за пределы подмассива при попытке такой переинтерпретации.
Yandex
Объявления
20.11.2014, 20:40     Преобразование нединамического двумерного массива через указатели
Ответ Создать тему
Опции темы

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