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

Обьяснить переменную - C++

Восстановить пароль Регистрация
 
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
04.04.2014, 12:29     Обьяснить переменную #1
В иходниках libav есть такая структура,

C++
1
int16_t (*motion_val[2])[2];
Обрашение к ней идет такое
C++
1
motion_val[i][j][k]
Обьясните не чистому сишнику, что это за чудозверь и как с ним работать (вернуть из функции, передать по указателю в функцию, копировать)

п.с. У меня есть предположнения, но я пока подожду высказывания.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
don_keyhot
 Аватар для don_keyhot
4 / 4 / 2
Регистрация: 02.04.2014
Сообщений: 60
04.04.2014, 13:54     Обьяснить переменную #2
нука я попробую у меня таже беда с указателями
1) скобки имеют приоритет
(*motion_val[2]) - это указатель
2) справа имеем [2] - это массив из двух элементов
значит на данный момент мы имеем, что это:
массив указателей на тип int16_t из 2 элементов ?... блин, запутаешься описывать порядок слов!

идем дальше, вонутрь скобок:
*motion_val[2] -
что приоритетнее * или []?.. вроде *
3) * - значит это указатель
на
4) [2] - массив из двух элементов типа ... а какого типа-то элементы массива ... int16_t ?

в итоге:
как бы это попонятнее выразить самому не понятное

массив указателей на тип int16_t, состоящий из 2 элементов типа указатель на массив из двух элементов
фуф-ты! ну как я!
вот только боюсь что все же НЕ правильно )
ибо с приоритетами операций у меня тоже пока беда
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
04.04.2014, 13:55     Обьяснить переменную #3
stima,
int16_t (* [2])[2] - массив из двух элементов типа A, где A = int16_t (*) [2].
int16_t (*) [2] - указатель на массив из двух элементов типа B, где B = int16_t
Массив из двух указателей на массив из двух int16_t, короче.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
04.04.2014, 14:14  [ТС]     Обьяснить переменную #4
DrOffset,
впринципе я придерживался того же, но ... я не могу замапить это на отображение в памяти, и почему это непросто
int16_t **
и как это он у них получился 3-х мерный?
don_keyhot
04.04.2014, 14:27
  #5

Не по теме:

DrOffset, спасибо, оказывается я НЕ ошибся, хотя и случайно )

DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
04.04.2014, 14:36     Обьяснить переменную #6
Цитата Сообщение от stima Посмотреть сообщение
и как это он у них получился 3-х мерный?
Указатель же.

На пальцах: есть две ячейки памяти в них содержится по указателю. Каждый из этих указателей указывает на массив. К указателю, даже если он одиночный, тоже можно применить операцию [].

motion_val[i] - получаем указатель, i изменяется от 0 до 1 включительно
motion_val[i][j] - получаем j-й массив (из 2х int16_t), диапазон j здесь неизвестен, скорее всего память выделяется динамически.
motion_val[i][j][k] - получаем значение типа int16_t, k от 0 до 1 включительно


Цитата Сообщение от stima Посмотреть сообщение
я не могу замапить это на отображение в памяти, и почему это непросто
А зачем его мапить? Задачку-то обрисуй.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.04.2014, 14:46     Обьяснить переменную #7
http://cdecl.org/
Только int16_t на int поменять. Иначе у парсера крыша едет.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
04.04.2014, 15:24  [ТС]     Обьяснить переменную #8
Задачки нету. Вопрос в том, что я немогу понять, зачем было использовать такую структуру а не просто массив указателей.
Впринципе я получил необходимый мне ответ, всем спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 16:00     Обьяснить переменную
Еще ссылки по теме:

Обьяснить код C++
C++ Обьяснить фрагмент кода
C++ Обьяснить, допустим ли приведенный код

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
04.04.2014, 16:00     Обьяснить переменную #9
Цитата Сообщение от stima Посмотреть сообщение
что это за чудозверь
Зверь вживую:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <iomanip>
#include <ctime>
using std::cout;
 
int main()
{   srand ((unsigned int) time (NULL));
    int (*motion_val[2])[2];
    int N = 5;
    
    int i,j,k;
    for (i = 0; i<2; i++)
        motion_val[i] = new int [N][2];
    
    for (i = 0; i<2; i++)
    {   for (j = 0; j<N; j++)
        {   for (k= 0; k<2; k++)
            {   motion_val[i][j][k] = rand()%5;
                cout << motion_val[i][j][k] << " ";
            }
            cout << "\n";
        }
        cout << "\n\n";
    }
 
    for (i = 0; i<2; i++)
        delete [] motion_val[i];
 
    std::cin.get();
    return 0;
}
Yandex
Объявления
04.04.2014, 16:00     Обьяснить переменную
Ответ Создать тему
Опции темы

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