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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
#1

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

20.11.2014, 19:25. Просмотров 241. Ответов 5
Метки нет (Все метки)

Здравствуйте. Почему эта программа крашится?
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++
поставлена такая задача - Реализовать функцию перемножения двумерных матриц bool Multi-plyMatrices(int** matrixA, int aRows, int aCols,...

Преобразование двумерного массива - C++
Помогите нужно написать функцию которая преобразовывает матрицу в строку по схеме например 1 2 3 4 5 6 7 8 9 в такую строку ...

Преобразование двумерного массива - C++
Добрый вечер. Сегодня передо мной поставили задачу следующего содержания: Даны 2 двумерных массива X и Y. Необходимо найти...

Преобразование двумерного массива - C++
Есть массив: 1 4 5 7 6 4 5 3 7 8 2 7 4 1 3 4 5 6 9 1 3 2 6 8 5 На выходе получится: 7 0 0 4 0 8 7 0 4 3 7 4 3 2 1

Функции двумерного массива. Транспонировать матрицу через ввод вывод функции двумерного массива. - C++
Транспонировать матрицу через ввод вывод функции двумерного массива.Сначала вывести ее,а потом провести транспонирование.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kerry_Jr
Модератор
Эксперт PHP
2186 / 1982 / 692
Регистрация: 14.05.2014
Сообщений: 5,794
Записей в блоге: 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
С чаем беда...
Эксперт CЭксперт С++
3804 / 2062 / 527
Регистрация: 18.10.2014
Сообщений: 3,671
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
1347 / 398 / 107
Регистрация: 22.10.2014
Сообщений: 862
Завершенные тесты: 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
С чаем беда...
Эксперт CЭксперт С++
3804 / 2062 / 527
Регистрация: 18.10.2014
Сообщений: 3,671
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.
С точки зрения физического представления данных в памяти - да, совершенно верно. Но на уровне языка переинтерпретация двумерного массива как одномерного формально запрещена. Т.е. например, некая отладочная реализация имеет право отлавливать выход за пределы подмассива при попытке такой переинтерпретации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 20:40
Привет! Вот еще темы с ответами:

Преобразование двумерного массива в одномерный - C++
Дан двумерный массив. Сформировать одномерный массив, каждый элемент которого равен сумме элементов соответствующей строки двумерного...

Преобразование двумерного массива в одномерный - C++
Помогите преобразовать данный двумерный массив в одномерный #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; using...

Преобразование двумерного массива.Подскажите пжл! - C++
Преобразовать массив S, осуществив поворот вокруг его центра на 90 градусов против часовой стрелки. =-O Помогите кто чем может!

заполнение массива через rand и вывод на экран через указатели - C++
Учитель задал заполнить массивы и случайными числами и вывезти на экран через указатели, через функцию rand выводит как вы понимаете одни...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.11.2014, 20:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru