Страниц: [1] 2 3 ... 10
 1 
 : Сегодня в 11:34:03 am 
Автор qnx_user - Последний ответ от qnx_user
Но эта функция откуда-то берёт данные. А что IDA показал?
Ну это конечно. Прикрепил файл.

 2 
 : Сегодня в 10:02:36 am 
Автор qnx_user - Последний ответ от da-nie
Цитировать
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

Но эта функция откуда-то берёт данные. А что IDA показал?

 3 
 : Сегодня в 08:50:18 am 
Автор qnx_user - Последний ответ от qnx_user
Цитировать
Интересный ключ. Smiley У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом?
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

Цитировать
Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?
нет

 4 
 : Мая 26, 2018, 09:35:55 pm 
Автор Absolut - Последний ответ от da-nie
Цитировать
А как быть с "безопасным извлечением"?

Вот, кстати, никогда в QNX его не делал. Судя по скорости работы с флэшкой, драйвер QNX вообще ничего не кэширует и пишет напрямую. Smiley И всё бы ничего, но...
Месяц назад поставил копирование данных с одного из стендов. Прихожу - ошибка записи. Странно. Флэшка не отображается. Подключаю к Windows. Видит диск, но... "Вставьте диск". Форматировать отказывается - диска-то нет. Короче, флэшка убилась. Контроллер виден, а диска внутри нет. Ладно. Флэшке 7 лет, может, она просто сдохла. Купил новую.
Вчера на этом же стенде такая же фигня. Записал файлы, а в Windows показывается, что флэшка пустая. Форматнул. Записал в Windows другие файлы. И флэшка через минуту отвалилась. Она тоже стала "вставьте диск". Но флэшка-то новая. Это подозрительно. Полез искать, что бы это всё значило. Нашёл программу ALCOR_MP. Вот эта-та программа мне флэшку и восстановила.
И всё же, мне непонятно, каким образом QNX 6.3 SP3 только на конкретной машине стала делать с флэшкой такое, что флэшка становится кирпичом? Это что же надо сделать, чтобы такое сотворить?  Huh?


 5 
 : Мая 26, 2018, 07:26:05 pm 
Автор DavASko - Последний ответ от da-nie
Цитировать
О чем и речь! И не просто сложным, а через чур сложным - с построением иерархии наследования и обилием кастования.

Да нет, просто каждый класс наделяется списком того, чем он владеет. А дальше обычная диспетчеризация по маршруту графа с опросом "это твоё?" и остановкой, когда найден владелец. На это можно пойти в GUI, так как в 99.9999999999% случаев скорость реакции это не снизит никак. В конце концов, как же писалось всё то ПО до С++ 11?

Цитировать
Берите связку boost::function и boost::bind пишите свои функторы и без ++11 уже можете передать в куда угодно свой кастомный объект с захватом вместо привычного всеми калбек методов.

С boost я не знаком вовсе (и насколько я слышал, там что-то очень монструозное). Smiley Но я о чём речь-то веду? Привязка функции обратного вызова в GUI библиотеках является низким уровнем, до которого пользователь, обычно, не допускается. В той же MFC всё это скрыто. Я не могу переопределить в MFC функцию окна оставаясь в MFC - мне для этого придётся регистрировать свой класс окна со всеми вытекающими.

Цитировать
А вот с лямбдой дело стоит иначе

Так мы о лямбда-функциях и говорим. У вас в примере они и есть.

 6 
 : Мая 26, 2018, 05:43:09 pm 
Автор da-nie - Последний ответ от da-nie
Итак, я-таки собрал прибор ночного видения на базе тепловизионного модуля flir lepton3 с разрешением 160x120. Выкинув нафиг все эти танцы с бубном вокруг USB и Flir One Gen 2.
Для сборки понадобится плата с контроллером stm32f407vgt6 - заказывается у китайцев, дисплей 320x240 с контроллером hx8347d - заказывается у них же (китаец, правда, присылает дисплеи одинаковые на вид, но с разными контроллерами), плата подключения lepton3 - также есть у китайцев, ну и сам датчик lepton3. Вот датчик отдельно купить не очень просто. Я купил неисправный тепловизор Flir One Gen 2(именно поколения 2!) у немца и вынул оттуда этот датчик. Желающие могут не покупать у китайцев переходную плату и сделать свою, благо в неисправном тепловизоре присутствует панелька для датчика. Правда, шаг контактов там столь мал, что  для него впору заказывать промышленную печатную плату. Утюгом это повторить смогут разве что единицы. Хотя, можно припаяться прямо на контакты процессора штатной платы тепловизора, но это несколько не эстетично. Smiley

Подключение вот такое:

Контакты дисплея:
дисплей плата
D0 - PD14
D1 - PD15
D2 - PD0
D3 - PD1
D4 - PE7
D5 - PE8
D6 - PE9
D7 - PE10
CS - PD7 (FSMC_NE1)
RW - PD7 (FSMC_NWE)
RD - PD7 (FSMC_NOE)
RS - PD7 (FSMC_A16)
RESET - PE1

Контакты модуля Lepton3:
модуль плата
SCK - PA5
MISO - PA6
MOSI - GND
CS - GND
SCL - PB6
SDA - PB7

В программе для управления дисплеем используется аппаратный модуль FSMC (flexible static memory controller), благо он есть в этом контроллере. Единственный нюанс - инициализацию портов, используемых FSMC нужно делать ДО инициализации самого FSMC. Иначе он не работает. Smiley Ну и по I2C я с лептоном в этом устройстве ещё не общался - не было надобности; он всё равно начинает отвечать по SPI сразу же. Скорость SPI выставлена на 40 мб/с. На 20 мб/с микроконтроллер пропускает данные. Контроллер работает на максимальной частоте 168 МГц. Для написания программы использовался HAL и CubeMX в связке с постоянно зависающим Keil 5. Smiley

Программа: https://github.com/da-nie/STM32F407VGT6AndFlirLepton3


 7 
 : Мая 26, 2018, 05:27:16 pm 
Автор DavASko - Последний ответ от lastcross
Цитировать
Так это всё решается механизмом диспетчеризации. Да, он будет сложным.
О чем и речь! И не просто сложным, а через чур сложным - с построением иерархии наследования и обилием кастования.

Цитировать
Да я не спорю, что так гораздо удобнее. Проблема только в том, что непосредственное подключение функций обратного вызова, вообще говоря, достаточно низкоуровневая часть, которую обычно скрывают.

Берите связку boost::function и boost::bind пишите свои функторы и без ++11 уже можете передать в куда угодно свой кастомный объект с захватом вместо привычного всеми калбек методов.

Цитировать
Потому что на уровне языка происходит магия - GUI, который не знает ничего, вызывает некую функцию, которая магическим образом сопоставляет именно вот это вызов именно с тем классом, для которого он был зарегистрирован (при этом GUI при регистрации получил обычную функцию, а что её надо перенаправить с дополнительной информацией знает только компилятор).

Это магия называется operator() и она не такая уж магия (компилятор за вас ее не строит). А вот с лямбдой дело стоит иначе - компилятор за вас формирует истинный тип лямбды - вы даже его получить не можете в явном виде.

Цитировать
Нет, так тоже не хочет. Ни основной, ни альтернативный. "1>main.cpp(46): error C2440: 'static_cast' : cannot convert from 'void' to 'InFunction_t'".
Но на самом деле, я даже не знаю, установлен у меня патч для Си++ 11 или нет. Я его сам точно не ставил. Я даже не помню, откуда у меня данный дистрибутив студии. Просто попробовал некоторые операторы и они заработали.
Скорее всего у вас не поддерживается ++11

Цитировать
Каким образом так получается-то?

Ну а тут магия использование средств ++11 и макросов.

 8 
 : Мая 26, 2018, 05:09:51 pm 
Автор DavASko - Последний ответ от da-nie
Цитировать
справа могут существовать не в единственно экземпляре (вообразите такой сложный продукт уровня Photoshop или IDE).

Так это всё решается механизмом диспетчеризации. Да, он будет сложным.

Цитировать
Дальше возможна ситуация, когда конкретную кнопку SomeButton нужно обработать в соответствии с состоянием контрола который ею владеет (непсредственого владельца).

Да я не спорю, что так гораздо удобнее. Проблема только в том, что непосредственное подключение функций обратного вызова, вообще говоря, достаточно низкоуровневая часть, которую обычно скрывают. В том же photon я могу назначить обработчик, но это будет далеко не лямбда. В результате возникает вопрос - что нужно взять (кроме Qt5), чтобы это  применять на практике. Вот на чём сейчас десктопные приложения пишут (ну, кроме net)? Я не знаю. Вот запускаю я DrWeb - на чём написан его интерфейс? Без понятия.

Цитировать
Почему скрытое?

Потому что на уровне языка происходит магия - GUI, который не знает ничего, вызывает некую функцию, которая магическим образом сопоставляет именно вот это вызов именно с тем классом, для которого он был зарегистрирован (при этом GUI при регистрации получил обычную функцию, а что её надо перенаправить с дополнительной информацией знает только компилятор).

Цитировать
А попробуйте вот так

Нет, так тоже не хочет. Ни основной, ни альтернативный. "1>main.cpp(46): error C2440: 'static_cast' : cannot convert from 'void' to 'InFunction_t'".
Но на самом деле, я даже не знаю, установлен у меня патч для Си++ 11 или нет. Я его сам точно не ставил. Я даже не помню, откуда у меня данный дистрибутив студии. Просто попробовал некоторые операторы и они заработали. Но они могут быть реализованы и до появления стандарта.

Цитировать
Что расположено до круглых скобочек - тип возвращаемого значения. Что внутри типы параметров

А, понятно. Smiley Это мне в голову не пришло.
Хотя непонятно, как такой шаблон может существовать. Ведь это же параметр. Разве можно сделать так: vector<int(int)>? Нельзя - непонятно, что это. А function<int(int)> создать можно. Каким образом так получается-то?

 9 
 : Мая 26, 2018, 01:34:57 pm 
Автор DavASko - Последний ответ от lastcross
Цитировать
Что-то я с таким не сталкивался. Если у меня есть форма, то я всегда знаю, от какого элемента и для кого будет это сообщение. Если же форма создаётся динамически, то элемент можно найти по его идентификатору/дескриптору.

Представим такую иерархию владения: MainWnd->UseForms->SelectorForm->Fields->SomeButton
Те что слева содержат тех что справа, при это типы окон (контролов) справа могут существовать не в единственно экземпляре (вообразите такой сложный продукт уровня Photoshop или IDE). Дальше возможна ситуация, когда конкретную кнопку SomeButton нужно обработать в соответствии с состоянием контрола который ею владеет (непсредственого владельца). Я так понимаю что вы предлагаете связывать обработчик с единственным экземпляром MainWnd. Допустим GUI система в связке со своей системой событий предоставляет идентификатор окна от которого пришло событие (хотя это не обязательно должно быть в общем случае - мы ведь не только рассматриваем GUI, а вообще концепцию передачи сообщений некой системе и ее обработки). Что будет делать MainWnd обработчик? Как он сопоставит по Handle-окна конкретный экземпляр Fields среди нескольких? Как вы приведете вообще это окно к типу Fields, чтобы начать делегирование обработки события? Вы набросайте это конструкцию и по-моему сразу станет все очевидно, где краткость и ясность - а где лишние телодвижения, лес в котором можно заблудится и нагородить ошибок.
Вдобавок, я не отметил тот факт - что замыкания так же используются для передачи не только ссылок на объект хранимый состояния, но и копии состояний. Это значит что на момент регистрации обработчика мы знаем с каким контекстом надо обрабатывать событие. То есть контекст обработки важен на момент регистрации, а не в момент создания события(связь окон с потоками, где окно может умереть раньше чем начать обрабатываться сам поток). Все это благодаря захвату с копированием. Даже на примере синхронного вызова - создаем множество кнопок, по нажатию которых выполнятся операции с выбранным файлом. Основываясь на патернах Command, для каждого обработчика нажатия кнопки захватываем по копии созданый объект команд. Все что нужно в обработчике - просто исполнить команду. Никакой явной диспечерезации в коде и размазанной логики (проверки что за кнопка - как соотнести ее с командой, где хранить/откуда получить дескриптор выбранного файла и т.д.)

Цитировать
Как я понимаю,  это такая же подмена истинной функции обратного вызова на нечто скрытое, создающееся компилятором с дополнительной информацией об объекте.
Почему скрытое? Это полноценный функциональный объект, который ведет себя как функция но способен хранить дополнительные параметры требуемые функции. Любда - вот это "мистика" создаваемая компилятором, так как некоторые механизмы скрываются на этапе компиляции (тип лямбды, ее расположение в коде и подобное). Функциональный объект он же как все объекты.

Цитировать
Кстати, по поводу functional.
То ли я что-то не понял, то ли VC2010 с functional работает странно. Вот я взял код из примера:
....
Всё это студия компилирует вот так:
...

А попробуйте вот так
Основная причина - ограничение стандарта ++11. В отличии от ++14 (вот пример), лямбда в ++11 не умеет автоматически выводить тип для своих аргументов (ну или умеет с ограничениями). Это означает, что недостаточно просто передать в место функтора лямбду. Лямбду надо преобразовать явно. То есть построить функтор на основе лямбды и передать

Цитировать
Пример понятен (кроме const function<int(int)> - что за странная запись int(int)?).
Что расположено до круглых скобочек - тип возвращаемого значения. Что внутри типы параметров. Про это можно почитать в документации  - ссылку я давал выше

 10 
 : Мая 26, 2018, 07:21:39 am 
Автор DavASko - Последний ответ от da-nie
Цитировать
В примере, он не может знать какому из объектов адресовать событие. Поэтому адресовать калбек к вашему объекту - некорректно.

Что-то я с таким не сталкивался. Если у меня есть форма, то я всегда знаю, от какого элемента и для кого будет это сообщение. Если же форма создаётся динамически, то элемент можно найти по его идентификатору/дескриптору.

Цитировать
На дворе 21 век.

Вот только на запрос "в чём написать графическое приложение для Windows для C++" ответ в поисковиках почему-то всё тот же MFC и Qt. Roll Eyes А запрос про применение замыканий приводит практически всегда к web-технологиям.

Цитировать
В Qt - есть свои механизмы сигнал-слот, построенный по схожему принципу.

А, ну до Qt5 я не дошёл. Smiley

Цитировать
Но еще раз повторюсь, что с лямбдой замыкания делать в разы удобнее, хотя можно извратится и делать подобное с функторами (там правда ограничений может быть порядочно из-за чего код получится слишком громоздким).

Это несомненно. Smiley

Цитировать
Почему же? Можно. Через std::bind в связке std::function

Как я понимаю,  это такая же подмена истинной функции обратного вызова на нечто скрытое, создающееся компилятором с дополнительной информацией об объекте.
Кстати, по поводу functional.
То ли я что-то не понял, то ли VC2010 с functional работает странно. Вот я взял код из примера:
Код:
auto lambda_in=[](int x)
 {
  return([=](int y) {return(x+y);});
 };

 auto lambda_out=[](const function<int(int)>& f,int z)
 {
  return(f(z)*2);
 };
 auto answer=lambda_out(lambda_in(7),8);
Пример понятен (кроме const function<int(int)> - что за странная запись int(int)?).
Всё это студия компилирует вот так:

Цитировать
1>main.cpp(39): error C2664: 'int `anonymous-namespace'::<lambda2>::operator ()(const std::tr1::function<_Fty> &,int) const' : cannot convert parameter 1 from 'void' to 'const std::tr1::function<_Fty> &'
1>          with
1>          [
1>              _Fty=int (int)
1>          ]
1>          Expressions of type void cannot be converted to other types
1>main.cpp(39): fatal error C1903: unable to recover from previous error(s); stopping compilation
1>
1>Build FAILED.

Цитировать
Надеюсь хотя бы малость мне удалось раскрыть "тайну использования" замыканий =)

Да, спасибо за информацию. Smiley К сожалению, я не знаю абсолютно никого, кто бы знал для чего всё это нужно и как этим пользоваться на практике. Поиск же в инете приводит к вороху бесполезных статей (как и в случае с unit-тестами). Smiley

Страниц: [1] 2 3 ... 10