Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Основоположник на всё
 Аватар для Fedor666
44 / 44 / 3
Регистрация: 22.02.2010
Сообщений: 362

Написать макрос, типа FAILED, для проверки возвращаемых ошибок и вывода соответствующих сообщений

25.12.2015, 15:55. Показов 1094. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Хочу сделать макруху, типа FAILED, для проверки возвращаемых ошибок и вывода соответствующих сообщений с расшифровкой и возможностью прервать/игнорировать, типа _ASSERT...
C++
1
#define ERR(hr){if(((HRESULT)(hr)) < 0) ErrorMessage(__FILE__, __LINE__,(int)hr);}
Но, вот беда: проверяемая фунция/метод вызывается дважды. Первый - для проверки (как и надо), а второй - для передачи аргумента в ErrorMessage.
В С++ чайник. Дело темное и в интырнете ничего не нашел. Как получить возвращаемое значение hr, а не сам вызов? Может какие макро-переменные бывают?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2015, 15:55
Ответы с готовыми решениями:

Написать пакетный файл для запуска утилиты проверки диска и вывода в файл статистики проверки
Написать пакетный файл для запуска утилиты проверки диска и вывода в файл статистики проверки

Макрос для проверки полей на значения и вывода сообщения про ошибку или ее отсутствие в этом поле
И так... У меня есть задание на создания макроса, который будет проверять значения полей на их правильность и выводить сообщение если в нем...

Макрос проверки типа данных ячейки
Доброго времени суток. Есть задание, в котором необходимо что бы ячейки, значение которых больше 0, окрашивались в один цвет, ячейки,...

8
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.12.2015, 16:01
C++
1
2
3
4
5
#define ERR(hr) \
{ \
   HRESULT r = (HRESULT)(hr); \
   if(r < 0) ErrorMessage(__FILE__, __LINE__,(int)r); \
}
Добавлено через 1 минуту
Но лучше написать нормальную функцию, а не макрос.
2
Основоположник на всё
 Аватар для Fedor666
44 / 44 / 3
Регистрация: 22.02.2010
Сообщений: 362
25.12.2015, 16:17  [ТС]
ForEveR, а где хранится r? Конфликт имен не произойдет если так два раза подряд проверять? А с функцией другая эпидемия - она будет вызываться и возвращаться всегда, даже если ошибок нет. Или я что-то не понял.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.12.2015, 16:25
Fedor666, r хранится в блоке. В каком смысле будет вызываться всегда? Макрос тоже будет вызываться всегда.
0
Основоположник на всё
 Аватар для Fedor666
44 / 44 / 3
Регистрация: 22.02.2010
Сообщений: 362
25.12.2015, 16:36  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
В каком смысле будет вызываться всегда?
ForEveR, макрос будет вызывать ErrorMessage только при выполнении условия и в противном случае никаких переходов вообще не будет.
Или я не понял про
Цитата Сообщение от ForEveR Посмотреть сообщение
Но лучше написать нормальную функцию, а не макрос.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.12.2015, 16:43
Fedor666, Эм. Да нет. Просто функция вида

C++
1
2
3
4
void check_error(HRESULT r)
{
   if (r < 0) ErrorMessage(__FILE__, __LINE__,(int)r);
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.12.2015, 16:53
Цитата Сообщение от ForEveR Посмотреть сообщение
Просто функция вида
__LINE__ не покажет нужную строку, если это будет функция, а не макрос.
И __FILE__ тоже не совсем актуален будет.
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.12.2015, 16:56
Tulosba, Точно. Гоню. Конечно макрос здесь лучше.
0
Основоположник на всё
 Аватар для Fedor666
44 / 44 / 3
Регистрация: 22.02.2010
Сообщений: 362
25.12.2015, 18:05  [ТС]
После долгих мытарств родил так:
C++
1
2
3
4
5
6
7
8
#define ERR(invoke){\
   register HRESULT r = (HRESULT)(invoke); \
   if(r < 0){\
        if(ErrorMessage(__FILE__, __LINE__,(int)r)==IDRETRY){\
            __asm{int 3};\
        }\
   }\
}
А также клоны ERRZ и ERRNZ (для мелкомягких чрезвычайно продуманных API).
И, конечно, ErrorMessage:
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
32
33
34
35
36
37
38
39
40
41
int ErrorMessage(LPCSTR srcFile, const int LineNumber, const int hr){
    TCHAR ErrMes[1024*4];
    TCHAR moduleName[MAX_PATH];
    TCHAR srcFileName[MAX_PATH];
    TCHAR strError[MAX_PATH];
    const WCHAR *strErrorAddr;
    TCHAR buildDate[16];
 
    int lastError = GetLastError();
 
    GetModuleFileName(0, moduleName, MAX_PATH);
    int s,d;
    for(s=0; moduleName[s++] != 0;);
    for(; moduleName[--s-1] != 92;);
    for(d=0; moduleName[s-1] != 0; moduleName[d++] = moduleName[s++]);
 
    MultiByteToWideChar(1251, 0, srcFile, -1, srcFileName, sizeof(srcFileName));
    for(s=0; srcFileName[s++] != 0;);
    for(; srcFileName[--s-1] != 92;);
    for(d=0; srcFileName[s-1] != 0; srcFileName[d++] = srcFileName[s++]);
 
    MultiByteToWideChar(1251, 0, __DATE__, -1, buildDate, sizeof(buildDate));
 
    if(hr>=-100){
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM+FORMAT_MESSAGE_MAX_WIDTH_MASK, 0, lastError, 0, strError, sizeof(strError), 0);
        strErrorAddr = strError;
    }else{
        strErrorAddr = DXGetErrorString(hr);
    }
 
    wsprintf(ErrMes, TEXT("Error in module: %s\nSource file: %s - %d\nBuild date: %s\nReturn code: %d\n%s\n( All errors are made by mistake :)"),
                          moduleName,
                          srcFileName,
                          LineNumber,
                          buildDate,
                          hr,
                          strErrorAddr);
    int Answer = MessageBox(0, ErrMes, AppName, MB_ABORTRETRYIGNORE+MB_ICONERROR+MB_SETFOREGROUND);
    if(Answer == IDABORT) ExitProcess(-1);
    return Answer;
}
Не нравятся только коды < -100 - надеюсь прокатит, __FILE__ и прочий подобный устаревший хлам не смог заставить возвращать юникод и не знаю как обратный слэш в юникоде обозначить. Экземпляр функции единственный, поэтому размер роли особо не играет. И при выпадании программы в осадок, скорость то же не очень важна. Понятные для мну (чайника) конструктивные предложения по оптимизации принимаются с радостью!
Пока как-то так...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.12.2015, 18:05
Помогаю со студенческими работами здесь

Написать функцию логического типа для проверки делимости задаваемого числа n на 3
1. Для делимости целого числа на 3 требуется, чтобы сумма цифр числа делилась на 3. Написать функцию логического типа для проверки...

Написать шаблон функции для вывода в обратном порядке массива типа int и double
Есть массив, нужно вывести его в обратном порядке

Программа для проверки ошибок
Нужна такая программа. Работает в консольном приложении. Описываю её работу: вводим любой код на С++ в консольном окне и программа выдаёт...

Оптимизация для проверки о новых сообщений
Для проверки о новых сообщениях я использую Java-script(JQuery) - код: &lt;div id = &quot;for_message&quot;&gt;&lt;?php require...

Программа для проверки орфографических и ошибок в тексте
Что может потребоваться для написании этой программы?:wall:


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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