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

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

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

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

20.11.2014, 19:25. Просмотров 238. Ответов 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++
поставлена такая задача - Реализовать функцию перемножения двумерных матриц bool Multi-plyMatrices(int** matrixA, int aRows, int aCols,...

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

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

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

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

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

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

Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам) - C++
Написать программу, создающую массив из 10 случайных целых чисел из отрезка . Вывести на экран весь массив и на ...

Сортировка массива через указатели - C++
как отсортировать по среднему балу именно таким способом, через **ppStAr? Ошибка IntelliSense: no suitable conversion function from...

Доступ к элементам массива через указатели - C++
Пишу программу для сортировки массива указателей // сортировка объектов через массив указателей на них #include&lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
Эксперт PHP
2178 / 1974 / 689
Регистрация: 14.05.2014
Сообщений: 5,771
Записей в блоге: 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Эксперт С++
3682 / 1957 / 512
Регистрация: 18.10.2014
Сообщений: 3,533
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
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 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Эксперт С++
3682 / 1957 / 512
Регистрация: 18.10.2014
Сообщений: 3,533
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     Преобразование нединамического двумерного массива через указатели
Ответ Создать тему
Опции темы

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