С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.11.2014, 19:25. Просмотров 276. Ответов 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, в первом варианте - указатель на указатель на инт, а во втором - просто указатель на инт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
Транспонировать матрицу через ввод вывод функции двумерного массива.Сначала вывести ее,а потом провести транспонирование.

5
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 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 Посмотреть сообщение
указатель на указатель
не есть двумерный массив.
1
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[][]?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3969 / 2193 / 553
Регистрация: 18.10.2014
Сообщений: 3,802
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;
А то, что у вас написано - сплошные ошибки.
2
Nosey
1349 / 400 / 107
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
20.11.2014, 20:26 #5
C++
1
data arr[I][J];
не есть двумерный массив, это одномерный массив размером I*J.
Такой записью его можно создать только на стеке, либо же в глобальной области памяти и с константным размером -> компилятор предоставляет синтаксическую плюшку для доступа к элементам превращая arr[i][j] в *(arr+i*J+j).

Ваши оба алгоритма неверны, в первом случае, вы разыменовываете не указатель а значение массива и выходите за пределы вашей памяти.
Во втором случае, вы перебираете только 9 элементов, а не 20.
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3969 / 2193 / 553
Регистрация: 18.10.2014
Сообщений: 3,802
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.
С точки зрения физического представления данных в памяти - да, совершенно верно. Но на уровне языка переинтерпретация двумерного массива как одномерного формально запрещена. Т.е. например, некая отладочная реализация имеет право отлавливать выход за пределы подмассива при попытке такой переинтерпретации.
1
20.11.2014, 20:40
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 выводит как вы понимаете одни...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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