Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Code::Blocks и приведение char к int


Автор: NYX 28.12.2009, 23:30
Здравствуйте товарисчи! Оч спецфчскй вопрос возник. Не так давно по обстоятельствам пришлось заюзать компилятор Code::Blocks smile Но вот беда, ранее написанный мною хидерок не работает. А теперь вопрос:
Я знаю что есть приведение типов а есть такие ситуации когда приведение типов вовсе не обязательны. Например if (int_a == char_b) // то есть если переменная a лежит в диапазоне 256 и она сравнивается с символьным типом, то либо true либо false. Если конкретнее, у меня места в коде, когда надо определить используемые диапазоны значений входящих массивов символьного типа. Ну как бы делаю это очень просто if (charSymbol >= 47) // значит вероятно это цифры. Но компилятор спокойно на стадии сборки сообщает следующее: Компаринг int и char всегда будет возвращать 1 smile то есть определить как бы не получается. Мне как бы в принципе не важно что за компилятор использовать, главное что бы он был ооочень небошого размера и что вот не было всяких лишностей типо ОГРОМНЫХ VCL библиотек и прочее. Так что если это дело является особенностью C::B то плизз, посоветуйте какой нить компилятор который вот нужен мне по вышеописанным параметрам. А если это дело в C::B решаемо, то просьба, подскажите smile Спасибо заранее за ваши отзывы! (переписать или типо вставлять приведение или перегонять данные из типа в тип не советуйте... кхм кода там дай боже, и переписывать то что по идее должно работать, это не выход счас для меня)

Автор: comcon1 29.12.2009, 00:49
Проверил GCC вот таким кодом:
Код

#include "stdio.h"

int main() {
    char a = '0';
    int b = 50;
    if (a > b)
        printf("yes %d",a);
    else
        printf("no %d",a);
    return 0;
}


Подставлял разные буквы:
Код

m@liquidspice ~/test
$ g++-4.exe -o tst1 tst1.cpp

m@liquidspice ~/test
$ ./tst1.exe
yes 48
m@liquidspice ~/test
$ g++-4.exe -o tst1 tst1.cpp

m@liquidspice ~/test
$ ./tst1.exe
no 48


Ни ругани, ни аномального поведения. Да и за третьим не замечал такого.

Добавлено через 4 минуты и 10 секунд
Подожди, сомнение закралось в меня и я почитал про C::B. Code::Blocks - это же не компилятор, это IDE! Ты напиши, какой у тебя компилятор-то.

Автор: mes 29.12.2009, 01:09
NYX, для начала покажите реальный кусок кода, на который ругается компилятор и его ругань.

Автор: NYX 29.12.2009, 01:14
эммм
Multiple compiler support:
GCC (MingW / GNU GCC)
MSVC++
Digital Mars
Borland C++ 5.5
Open Watcom
...and more


mingw стало быть smile по дефолту smile

Странно, почему то этого не происходит больше, теперь все работает и не могу понять каким образом smile сначала не знал как сделать, теперь не знаю как сломать smile

вот фрагментец:
Код

void NGSS::Generis(char *arg_a, char *arg_b)
{
if ((strlen(arg_a) > 256) | (strlen(arg_b) > 256))
    {
    strcpy(NGSS::ERROR, " -- NGSS::Generis length of ARG_A|ARG_B > 256");
    return;
    }

for (int argindex = 0; argindex < 256; argindex++)
    {
    for (char range = 0; range < 47; range++)
        {
        if (arg_a[argindex] == range)
        strcpy(NGSS::ERROR, "Symbols");
        }
    }
//.........................
}


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

Автор: comcon1 29.12.2009, 02:45
Нашел вот такой чпок:
Цитата

-Wtype-limits
    Warn if a comparison is always true or always false due to the limited range of the data type, but do not warn for constant expressions. For example, warn if an unsigned variable is compared against zero with `<' or `>='. This warning is also enabled by -Wextra. 


Очисть объектные файлы и собери снова. И версию GCC назови заодно.

Добавлено через 3 минуты и 2 секунды
И кстати, я не пойму, нахрена тебе второй цикл, если можно просто:
Код

if (arg_a[argindex] < 47) {
// бла-бла
}

Автор: NYX 29.12.2009, 03:47
Да не циклы это я как бы для проверки вставил smile там совсем по другому все smile А версия GCC кажысь одна из последних smile Вот какая счас на оффсайте кодблокс лежит в сборке с их IDE такая вот у меня и стоит smile Апасибо за ответы, благо теперь сел за RAD smile На Eee 701 особо не по кодишь smile чисто символически тока еси 

Да а сообщение один в один как у меня было!

Автор: bsa 29.12.2009, 11:36
Цитата(NYX @  29.12.2009,  03:47 Найти цитируемый пост)
Да а сообщение один в один как у меня было!
Конечно, а почему должно быть другое? Тут просто смысл в том, что компилятор предупреждает когда видит конструкции if (uint_x < 0) или if (uint_x >= 0)... Тут же понятно, что unsigned всегда будет больше либо равен нулю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)