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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скомбинировать 2 инта в 1, с проверкой перекрытия и переполнения 
:(
    Опции темы
leniviy
Дата 22.5.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#define _MP_BITS 4

#define MAKE_TAG(hi, lo) ( ((hi) << _MP_BITS) | (lo) )

#define MAKE_TAG_STATIC(c_hi, c_lo) ...
...
switch(MAKE_TAG(a, b)) {
case MAKE_TAG_STATIC(HI1, LO1):
case MAKE_TAG_STATIC(HI1, LO2):
case MAKE_TAG_STATIC(HI3, LO3):
;
}


нужно, чтобы этот код не смог скомпилироваться, если hi << _MP_BITS переполняется или перекрывается с lo.
PM MAIL   Вверх
Guinness
Дата 22.5.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



#error не пробовали?
PM MAIL   Вверх
leniviy
Дата 22.5.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



директивы нельзя использовать в теле макроса. Я думаю использовать деление на 0
PM MAIL   Вверх
leniviy
Дата 22.5.2013, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <stdio.h>
#include <limits.h> /* for UINT_MAX */

#define UFIH__CALL_TYPE__TA_MOC    11
#define UFIH__CALL_TYPE__TA_MTC    12

#define UFIH__GSM_PI__TELEPHONY   20017
#define UFIH__GSM_PI__MTSMS       20033
#define UFIH__GSM_PI__MOSMS       20034
#define UFIH__GSM_PI__GPRS           41

#define _INTCOMB_MAXHI (UINT_MAX >> INTCOMB_BITS)
#define _INTCOMB_MAXLO (~(UINT_MAX << INTCOMB_BITS))
#define _INTCOMB_VALID(val, maxval) ((val) >= 0 && (val) <= maxval ? 1 : 0)

#define INTCOMB_BITS 8
#define INTCOMB_DEFAULT -1
#define INTCOMB_STATIC(hi, lo) ( ( ((hi) << INTCOMB_BITS) | (lo) ) / _INTCOMB_VALID( (hi), _INTCOMB_MAXHI) / _INTCOMB_VALID( (lo), _INTCOMB_MAXLO) )
#define INTCOMB(hi, lo) ( _INTCOMB_VALID( (hi), _INTCOMB_MAXHI) && _INTCOMB_VALID( (lo), _INTCOMB_MAXLO) ? ( ((hi) << INTCOMB_BITS) | (lo) ) : INTCOMB_DEFAULT )

int main(int argc, char* argv[])
{
    int hi, lo;
    printf("possible GSM PI:\n");
    printf("    UFIH__GSM_PI__TELEPHONY = %d\n",   UFIH__GSM_PI__TELEPHONY);
    printf("    UFIH__GSM_PI__MTSMS = %d\n",       UFIH__GSM_PI__MTSMS);
    printf("    UFIH__GSM_PI__MOSMS = %d\n",     UFIH__GSM_PI__MOSMS  );
    printf("    UFIH__GSM_PI__GPRS = %d\n",          UFIH__GSM_PI__GPRS );

    printf("possible call types:\n");
    printf("    UFIH__CALL_TYPE__TA_MOC = %d\n",    UFIH__CALL_TYPE__TA_MOC);
    printf("    UFIH__CALL_TYPE__TA_MTC = %d\n",    UFIH__CALL_TYPE__TA_MTC);
    printf("\n");

    printf("input 2 ints> ");
    if (scanf("%d %d", &hi, &lo) < 2) {
        return 1;
    }

    switch(INTCOMB(hi, lo)) {
        case INTCOMB_DEFAULT:
        default:
            printf("unknown combination: %d %d\n", hi, lo);
            break;

        /* TELESERVICECODE */
        case INTCOMB_STATIC(UFIH__GSM_PI__TELEPHONY, UFIH__CALL_TYPE__TA_MTC):
            printf("roaming Mobile Terminated Voice call\n");
            break;
        case INTCOMB_STATIC(UFIH__GSM_PI__TELEPHONY, UFIH__CALL_TYPE__TA_MOC):
            printf("roaming Mobile Originated Voice call\n");
            break;
        case INTCOMB_STATIC(UFIH__GSM_PI__MOSMS, UFIH__CALL_TYPE__TA_MOC):
            printf("roaming Mobile Originated SMS\n");
            break;
        case INTCOMB_STATIC(UFIH__GSM_PI__GPRS, UFIH__CALL_TYPE__TA_MOC):
            printf("roaming GPRS\n");
        /* BEARERSERVICECODE */
        /* CDR_CALLTYPE_ROAM_MO_VT, CDR_CALLTYPE_ROAM_MT_VT, CDR_CALLTYPE_ROAM_DATA_MO, CDR_CALLTYPE_ROAM_DATA_MT */
    }
    return 0;
}

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

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

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

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

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


 




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


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

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