Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2011, 15:53   #1
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию поясните смысл объявления поля структуры

Код:
    /**\
     * motion vector table\
     * @code\
     * example:\
     * int mv_sample_log2= 4 - motion_subsample_log2;\
     * int mb_width= (width+15)>>4;\
     * int mv_stride= (mb_width << mv_sample_log2) + 1;\
     * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];\
     * @endcode\
     * - encoding: Set by user.\
     * - decoding: Set by libavcodec.\
     */\
    int16_t (*motion_val[2])[2];\
это часть большого #define, который потом вставляется внутрь struct, поэтому обратные слэши в конце строк. Вопрос в другом, чем фактически является поле motion_val? Двухэлементным массивом указателей на двухэлементные массивы? А int16_t куда притулить?

И ещё убило вот это из комментария:

Цитата:
motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];\
Откуда там третье измерение? Да ещё и двухиндексовое.
(И так могзи от жары кипят, а тут ещё третье измерение открывается..).

С не родной язык, поэтому, если можно аналог на Паскале, было бы вобще шикарно. Спасибо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 01.06.2011 в 15:55.
veniside вне форума Ответить с цитированием
Старый 01.06.2011, 16:04   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

массив из двух указателей на массив из двух интов
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.06.2011, 16:17   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

OK, тогда, если не сложно, поясните, что будет означать запись:

Код:
v.motion_val[0][1][0, 1] = 0;
[0] - указатель на массив, ок
[0][1] - второй элемент массива, на который указывает первый элемент из массива указателей, ок
[0][1][0, 1] - ???
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.06.2011, 16:23   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
массив из двух указателей на массив из двух интов

Цитата:
[0][1][0, 1] - ???
Трёхмерный массив, третье измерение которого в свою очередь двумерное.
Ну, в моём понимании так.
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.06.2011, 16:28   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Трёхмерный массив, третье измерение которого в свою очередь двумерное.

так и я могу объяснить ) Но откуда там третье измерение, если поле объявлено как:

Код:
int16_t (*motion_val[2])[2];
Тем не менее, такой код компилируется, значит, компилятор что-то знает, чего не знаю я.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.06.2011, 16:30   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

значит создали динамический массив одной такой структуры.

т.е как это используется
Цитата:
int mass1[2] = {1, 2}; //массив1
int mass2[2] = {3, 4}; //массив2

int (*motion_val[2])[2]; //наша структура данных

motion_val[0] = &mass1; //сохраняем указатель массива1
motion_val[1] = &mass2; //сохраняем указатель массива2

cout << (*motion_val[0])[0] << endl; //разыменовываем первый элемент структуры, получаем наш массив, обращаемся уже по индексу
cout << (*motion_val[0])[1] << endl;

cout << (*motion_val[1])[0] << endl; //разыменовываем второй элемент нашей структуры
cout << (*motion_val[1])[1] << endl;
раз у них появилось третье измерение, значит им нужно смещение, отличное от нуля, соответственно у них массив таких структур.
например, ты объявляешь
char *p;
разыменовать это можешь как я (*p) или как они (p[0]). это одно и то же. но вторая запись нелогична, если у тебя один элемент. соответственно у них массив из двух указателей (которые на самом деле являются указателями на начало одномерного массива НЕИЗВЕСТНОЙ длины (как и в случае с char *p, ты не знаешь, какая длина у массива p)) на массив из двух интов

ну а [0, 1] - оператор запятая. индекс это то, что после запятой. что перед - просто высчитывается. хотя это я не до конца осознаю
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 01.06.2011 в 16:36.
pproger вне форума Ответить с цитированием
Старый 01.06.2011, 16:48   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> разыменовать это можешь как я (*p) или как они (p[0]). это одно и то же

ах вот оно как. Это меняет дело.

> соответственно у них массив из двух указателей (которые на самом деле являются указателями на начало одномерного массива НЕИЗВЕСТНОЙ длины) .. на массив из двух интов

спасибо, это я попыпаюсь осознать вечером, когда жара спадёт )

> оператор запятая ... хотя это я не до конца осознаю

так, стоп. "Оператор запятая" -- это из С++? Это исходник на чистом С.
Вот мой полный пример, который компилится:

Код:
#include "stdafx.h"
#include <malloc.h>

struct VAL {
	int (*motion_val[2])[2];
};

int _tmain(int argc, _TCHAR* argv[])
{
  VAL v;
  v.motion_val[0][1][0, 1] = 0;
}
(Да, он падает, т.к. массив не инициализирован, но он компилится!)

Дебаггер выдает нечто:

Код:
 mov         eax,dword ptr [v] 
 mov         dword ptr [eax+0Ch],0
т.е. это просто ещё одно смещение, но почему он позволяет его так странно записывать?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.06.2011, 16:53   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2veniside
запятая есть в сях

с моей точки зрения
v.motion_val[0][1][0, 1] = 0;
абсолютно аналогичен
v.motion_val[0][1][1] = 0;

хотя я уже сказал, я не уверен

оставь название проекта, и имя файла, где это встретилось вечером дома для себя поковыряю. вижу что какой то кодек
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.06.2011, 17:03   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> запятая есть в сях

а, ну тогда мне осталось полистать мануал, теперь знаю на какой странице, спасибо ещё раз.

> оставь название проекта, и имя файла, где это встретилось вечером дома для себя поковыряю. вижу что какой то кодек

да, это из ffmpeg, файл avcodec.h
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.06.2011, 17:05   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2veniside
спс, посмотрю
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление(добавление) поля из(в) структуры kilgoreq Помощь студентам 0 22.02.2011 00:59
Объявления KemanSR Visual C++ 11 29.01.2011 22:54
Объявления событий Aleksey1989 Помощь студентам 11 04.11.2010 11:14
Краткий смысл. В чем цель и смысл вашей жизни? grenles Свободное общение 20 13.09.2010 07:13
почему не правильно заполняет поля структуры ... ??? MichaelRED Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 09.06.2010 17:49