Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переход к элементу массива с помощью разыменования 
:(
    Опции темы
vdm
Дата 19.6.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



К примеру есть массив unsigned mas[100];
Можно ли получить значение 6 элемета этого массива так:

Код

(*(unsigned*)((byte*)(mas + 5)));
 ?
или как нибудь иначе, но перед етим разыменовав unsigned в byte?


PM MAIL   Вверх
mes
Дата 19.6.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vdm @  19.6.2008,  20:57 Найти цитируемый пост)
но перед етим разыменовав unsigned в byte?

выложи лучше свою задачу , почему тебе приходится приводить к указателю на байт  ?
если ты думаешь что очисттся все кроме 8 бит  - то ошибаешься

Добавлено через 4 минуты и 8 секунд
не забывай что в своем примере оперируешь с указателями а не их значениями


--------------------
PM MAIL WWW   Вверх
vdm
Дата 20.6.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата(mes @ 19.6.2008,  21:04)
Цитата(vdm @  19.6.2008,  20:57 Найти цитируемый пост)
но перед етим разыменовав unsigned в byte?

выложи лучше свою задачу , почему тебе приходится приводить к указателю на байт  ?
если ты думаешь что очисттся все кроме 8 бит  - то ошибаешься

Добавлено @ 21:08
не забывай что в своем примере оперируешь с указателями а не их значениями

Не думаю, что это в вашей компитентности. Речь идёт о попиксельном прохождении по картинке.
Цель: на всём сыкономить время обработки...

вот пример, но почему-то не проходит проверка на цвет пикселя... постоянно срабатывает else.
Код

int width   = pBitmap->GetWidth();
int height  = pBitmap->GetHeight();

int strideSrc = bitmapData.Stride;

unsigned* oRow = (unsigned*)((byte*)bitmapData.Scan0 + strideSrc); 

for (int y = 1; y < height-1; y++)
{
    for (int x = 1; x < width-1; x++)
    {
        if (oRow[x] == 0xFFFFFF00) 
            oRow[x] = 0xFFFF0000;
        else
            oRow[x] = 0xFFF4F4F4;
}    
    // переходим к следующей строке
    oRow = (unsigned*)((byte*)oRow + strideSrc);
}


PM MAIL   Вверх
bsa
Дата 20.6.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



vdm
Код
unsigned mas[100];
unsigned *p = (unsigned*)( (byte*)(mas + 5) ); //операция приведения к byte* компенсируется обратным приведением к unsigned *
assert(p == &mas[5]);
Вообще-то, приведение указателя - это условность компилятора. На самом деле, как был адрес, так и остался (для указателей на объекты классов операция может быть несколько сложней)
PM   Вверх
mes
Дата 20.6.2008, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vdm @  20.6.2008,  00:07 Найти цитируемый пост)
вот пример, но почему-то не проходит проверка на цвет пикселя... постоянно срабатывает else.
if (oRow[x] == 0xFFFFFF00) 

Ну выведидля проврки все значения своего рисунка и посмотри есть ли там цвет  0xFFFFFF00

Цитата(vdm @  20.6.2008,  00:07 Найти цитируемый пост)
    oRow = (unsigned*)((byte*)oRow + strideSrc);

что то из примера не стало понятно для чего нужен byte*



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 20.6.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(mes @  20.6.2008,  09:06 Найти цитируемый пост)
(unsigned*)((byte*)oRow + strideSrc);

Цитата(bsa @  20.6.2008,  08:13 Найти цитируемый пост)
(unsigned*)( (byte*)(mas + 5) ); 

Эти два кода работают по разному. В первом - сдвиг на strideSrc байтов, во втором - на 5*sizeof(unsigned).


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 20.6.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  20.6.2008,  12:01 Найти цитируемый пост)
Эти два кода работают по разному. 

 smile оп не увидел что byte* берется в обшую скобку вместе со StrideSrc  smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0711 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.