Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873

Кто-нибудь поясните мне сакральное значение двух констант.

20.02.2020, 11:44. Показов 842. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня в проекте наткнулся на очень любопытный код, может мне кто-нибудь пояснить, что это может значить.

C++ (Qt)
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
CFramesQueue::CFramesQueue(const unsigned int itemsCapacity, const quint64 dataAmountCapacity) :
    headIndex_(0),
    tailIndex_(0),
    itemsCapacity_(itemsCapacity),
    itemsCount_(0),
    dataAmountCapacity_(dataAmountCapacity),
    dataAmount_(0)
{
    this->framesQueue_ = new CVideoFrameV2 * [ itemsCapacity ];
    // Это первая константа - 0x0F0F0F0F
    memset(this->framesQueue_, 0x0F0F0F0F, sizeof(CVideoFrameV2*) * itemsCapacity);
}
 
CVideoFrameV2 * CFramesQueue::Dequeue() {
    CVideoFrameV2 * res = 0;
    this->lock_.lock(0);
    if (this->itemsCount_) {// queue is not empty
        res = this->framesQueue_[ this->tailIndex_ ];
        // Это вторая константа - 0xAAAAAAAA
        this->framesQueue_[ this->tailIndex_ ] = (CVideoFrameV2*)0xAAAAAAAA;// zero it !
        this->tailIndex_ = (this->tailIndex_ + 1) % this->itemsCapacity_;// to roll to zero
        this->itemsCount_--;
        this->dataAmount_ = (res->length > this->dataAmount_) ? 0 : (this->dataAmount_ - res->length);
    }
    this->lock_.unlock();
    return res;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2020, 11:44
Ответы с готовыми решениями:

Может кто-нибудь поможет мне с запросом? Новичок
На забалансовом счету находится график платежей по облигациям. Таким образом я его могу получить: БИ =...

кто нибудь назовите мне системки нормальные автокада
И так буду собирать комп для када стоит вопрос сколько тыкать туда оперативы, насколько процессоро зависимая это прога и что там по видео...

Кто-нибудь объясните мне,что происходит в этом коде
«Мы запускали процесс симуляции четыре раза, и температура главного модуля постоянно отклонялась в сторону понижения, — раздраженно...

13
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.02.2020, 12:25
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
// Это первая константа - 0x0F0F0F0F
    memset(this->framesQueue_, 0x0F0F0F0F, sizeof(CVideoFrameV2*) * itemsCapacity);
Это, скорее всего, бред. 2-й аргумент функции memset - char. А тут int или long. Ну, транслятор приведет его к char, все же родные, целые. Может и поворчать - типа потеря значности. Но вполне достаточно 0x0F

Добавлено через 6 минут
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
(CVideoFrameV2*)0xAAAAAAAA;
Тут менее понятно, т.к. неизвестно, что за класс или тип CVideoFrameV2. Впрочем, это неважно, так как приводится к указателю.
Почему-то автор кода уверен, что по адресу 0xAAAAAAAA у него лежит нечто особенное. Или сам адрес такой особенный, и он его где-то на эту особенность проверяет. В любом случае чувствуется "рука мастера". Таким мастерам руки надо связывать. Или отрубать
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.02.2020, 12:29
Цитата Сообщение от Байт Посмотреть сообщение
Это, скорее всего, бред. 2-й аргумент функции memset - char. А тут int или long.
ты сам часом не бредишь?
какой ещё char, откуда ты его взял?
0
2734 / 889 / 331
Регистрация: 10.02.2018
Сообщений: 2,108
20.02.2020, 12:36
Возможно, эти константы были нужны для отладки. Первоначально, незаполненные данные помечались 0x0F. Когда буфер выбирался Dequeue, незаполненные данные помечались 0xAA. Если остановить программу в какой-то момент по брекпоинту и посмотреть на память кольца, то по его содержимому можно понять, что и как происходило в очереди.
2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.02.2020, 12:38
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
memset(this->framesQueue_, 0x0F0F0F0F, sizeof(CVideoFrameV2*) * itemsCapacity);
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
(CVideoFrameV2*)0xAAAAAAAA;// zero it !
Делается это, скорее всего, в диагностических целях.
Адрес заведомо невалидный задан в расчете на то, что в случае ошибки программиста будет видно причину (грубо говоря: видим в сообщении или в отладчике такой интересный адрес, значит понимаем откуда растут ноги у ошибки).

Примеры такого подхода в разных системах: https://en.wikipedia.org/wiki/... bug_values
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.02.2020, 12:41
Цитата Сообщение от hoggy Посмотреть сообщение
ты сам часом не бредишь?
какой ещё char, откуда ты его взял?
Есть такое дело. Давненько доку в руки не брал.
C
1
void *memset(void *s, int c, size_t n);
Описание в старинной книжке: Присваивает первым n байтам массива s значение символа c.
Дальше понимайте сами, как знаете...

Добавлено через 2 минуты
Господа, извиняюсь за резкость оценки. Такого хитрого приема на знал.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.02.2020, 12:43
Цитата Сообщение от Байт Посмотреть сообщение
Дальше понимайте сами, как знаете...
Дальше вот что (про C++):
https://en.cppreference.com/w/... yte/memset
Converts the value ch to unsigned char and copies it into each of the first count characters of the object pointed to by dest.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.02.2020, 12:46  [ТС]
Байт, сложно сказать, что думал автор, пока это все писал... И восстановить как-то ход этих мыслей тоже не представляется возможности. А у меня прога валиться по sigsegv, никак не могу найти, где косяк. Уже перебираю все возможные варианты, хотя берут сомнения, что причина в этом странном коде.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.02.2020, 12:47
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
может мне кто-нибудь пояснить, что это может значить.
никогда не думал о том, как дебажные сборки
догадываются об использовании неинециилизрованных переменных, порче куче?
выходе за пределы диапазонов?

когда компилятор видит неинициализированный указатель,
то он сам инициализирует его каким то магическим значением.
например, msvc2015 записывает 0xcccccccc
и теперь легко проверить: был ли данный указаетль корректно инициализирован

значения твоих констант 0x0F0F0F0F, 0xAAAAAAAA - подобные маркеры.
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.02.2020, 12:49  [ТС]
DrOffset, Ygg, если это и нужно было для отладки, тогда начальство крепко программисту нагрубило, и этот код ушел в релиз. Надеюсь, что нигде не оставил мне автор прикола типа:
C++
1
#define true false // счастливой отладки с***и
Причем я уточнял у старожилов, там действительно вышел шкандаль с одним из кодеров до меня.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.02.2020, 12:52
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
А у меня прога валиться по sigsegv, никак не могу найти, где косяк.
Так это хорошо, что валится! Плохо было бы, если бы не валилось, но при этом неправильно работало. Этот адрес специально и задан, чтобы у вас гарантированно все упало, чем сигнализировало о примерном хотя бы месте некорректной работы. И если она валится на разыменовании этого странного адреса, например, то вам по идее, должно быть понятна причина. Где-то не присвоено было верное значение, либо вследствие каких-то ошибочных действий программа получает доступ к тому, к чему не должна была. Это значит, что
либо
* от момента падения, нужно отматывать назад и смотреть где и по какой причине адресу не было выставлено верное значение.
либо
* нужно смотреть почему этот код обращается к некорректному адресу. (из общеизвестных ситуаций можно вспомнить разыменование end итератора как пример такой ошибки)
3
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.02.2020, 13:01  [ТС]
Спасибо всем за ценные советы! Значит я еще пока в здравом уме.

Добавлено через 9 минут
DrOffset, да я примерно даже знаю, почему и где валиться. Но вот не могу найти кода, который бы гарантированно устанавливал через функцию указатель в 0.
У меня это делается с помощью следующей функции:
C++
1
2
3
4
5
6
void CVideoFrameFactory::Release(CVideoFrameV2 **frame)
{
 if(frame == 0 || *frame == 0) return;
...
*frame = 0;
}
Но при отладке не всегда указатель становится 0. И соответственно при повторном освобождении памяти прога говорит, что больше так жить не может и уходить умирать в долину мертвых слонов.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.02.2020, 13:03
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
если это и нужно было для отладки, тогда начальство крепко программисту нагрубило, и этот код ушел в релиз.
Сам по себе этот код ни в чем не виноват.
Если там что и было сломано из-за конфликта, то явно не в этом месте. Этот код вскрывает проблему, а не создает ее. Понимаете?
Если вы сейчас будете менять только этот код, то просто замаскируете проблему и ее потом вообще никто не найдет
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.02.2020, 13:45  [ТС]
DrOffset, у меня все git помнит, да и есть большая проблема с воспроизведением ошибки в офисных условиях, т.к. она обычно проявляется на 60+ камерах, а у меня от силы 16... А на охраняемых объектах мне никто отлаживаться не даст, вот и метаюсь по куче кода без каких-либо результатов. Да еще и 150 ревизий утрачено во время переездов. Ладно, это уже совсем другая история.

Еще раз всем спасибо за комментарии. Ушел в кодинг.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2020, 13:45
Помогаю со студенческими работами здесь

Кто-нибудь пожалуйста, объясните мне, что значит данный пост?
)))это в общем смешно (или глупр), но мне очень интересно - вопрос к ветеранам: о чем вот этот пост...

непроходимая защита . мне интересно сможет ли кто нибудь найти мою защиту
непроходимая защита ... мне интересно сможет ли кто нибудь найти мою защиту есть форма для ввода данных- рисунок 1 после...

есть кто нибудь поможет мне писать demo с использованием jquery & ajax
задача: jQuery Dialog practise: Загрузка таблицы "пользователи" (деление на страницы с помощью Ajax, 20 записей на странице) Клик по...

Еще один глюк. На этот раз с printf. Объяснит мне кто-нибудь в чем прикол???
Вот кусок текста: Dir = Dir_X + Dir_Y; printf("X%d,",dX); printf("%s ",Xs); ...

Кто-нибудь поможет мне с блок-схемами для кода, написанного на паскале? Заранее спасибо!
Здравствуйте! Буду очень благодарен, если кто-нибудь поможет мне с блоксхемами для этого кода: program matrix; uses crt; const n...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru