LINUX.ORG.RU

Гм.. ответа не знал, но время есть да и интересно. Решил тоже погуглить. Нашел похожий баг: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12639 Не твой ли случай? Т.е. судя по всему бага появляется при включении оптимизации. Кстати, в гугле находил аналогичную проблему на форуме Microsoft и там тоже корнем проблемы была оптимизация.

php-coder ★★★★★
()
Ответ на: комментарий от php-coder

:-O

Спасибо. Точно, без оптимизации всё нормально... Но так как оптимизация является необходимым условием, надо бы как-то решить проблему по-другому...

Работает, если сделать ((int)foo > 0), но я не уверен, будет ли оно при любых значениях foo правильно работать? Или будет?

shuthdar ★★★
() автор топика
Ответ на: комментарий от shuthdar

>Работает, если сделать ((int)foo > 0), но я не уверен, будет ли оно при любых значениях foo правильно работать? Или будет?

int!=long long по размеру ! И вообще это архитектурно-зависимо

xnix ★★
()
Ответ на: комментарий от xnix

Но зато при этом выдаётся правильный результат, на маленьких числах, по крайней мере :)

Я потому и говорю, что не уверен, будет ли работать. Как я понимаю, при преобразовании (int)foo лишние 8 бит отрезаются? Как это влияет на положительность числа?

shuthdar ★★★
() автор топика

censored:/tmp # cat qqq.c
main() {
    volatile long long r = -1LL;

    printf("%d\n", (r>0));
    return 0;
}
censored:/tmp # gcc -v
Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.1.2 --enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --program-suffix=-4.1 --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic --host=i586-suse-linux
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)
censored:/tmp # gcc -O2 qqq.c
qqq.c: In function ‘main’:
qqq.c:4: warning: incompatible implicit declaration of built-in function ‘printf’
censored:/tmp # ./a.out
0

anonymous
()
Ответ на: комментарий от anonymous

Ну, если убрать лишнее:

typedef volatile long long slli; // volatile добавил после вашего примера, результат не изменился

int main()
{
  FILE *fin
  int ncmd;
  char cid;
  slli ctype;

  fin = fopen(INFILE, "r");
  fscanf(f, "%i\n", &ncmd);
  while (ncmd) {
    fscanf(fin, "%c %d\n", &cid, &carg);
    printf("%d ", carg);
    printf("%d\n", (carg>0));
  }
  return 0;
}

И вывод такой:
5 1
237845 1
3 1
-2 1
6 1
4 1
4 1
4 1
-2 1
3 1
8 1
9 1
6 1

shuthdar ★★★
() автор топика
Ответ на: комментарий от anonymous

А на этом примере у меня всё работало.

$ gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.1-20061215/configure --prefix=/usr --enable-shared --enable-languages=c,c++,objc --enable-threads=posix --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --enable-clocale=gnu
Thread model: posix
gcc version 4.1.2 20061215 (prerelease)

shuthdar ★★★
() автор топика
Ответ на: комментарий от anonymous

Сначала у меня там было просто %i, считывалось нормально, потом, увидев ваш пример, написал %d - подумал, что так правильно.

shuthdar ★★★
() автор топика
Ответ на: комментарий от anonymous

Заработало, благодарствую. Не знал про %ll.

shuthdar ★★★
() автор топика
Ответ на: комментарий от anonymous

P.P.S. Насчет %ll глюканул. %lld все же.

anonymous
()
Ответ на: комментарий от bugmaker

А разве трабла при сравнении с нулём - очень плохо? Я думал, что трабла при сравнении числа с самим собой хуже, да и потцаны на районе подтвердили...

shuthdar ★★★
() автор топика
Ответ на: комментарий от shuthdar

Потсаны не шарят. Сравнение а с а сводится к сравнению (а-а) с нулём, посему евляется частным случаем сравнения с нулём. А вот сравнение а с нулём, разделённое на некоторое Епсилон, является частным случаем сравнения (бесконечно) большого с нулём, при достаточно малом Епсилон. Ежу понятно что нужно быть полным лохъом, чтобы облажаться при сравнении (бесконечно) большого с нулём, вестимо.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

Фигасе, скажу завтра потсанам что они лохи и быдло! А что надо учить чтобы больше так не лажаться, а то перед c00l h4x0r-ами стыдно :(

shuthdar ★★★
() автор топика
Ответ на: комментарий от Pi

Хм, я правда нагрубил? В таком случае прошу извинить, ибо я не имел цели оскорбить или обидеть кого-либо. Насчёт понтоваться - не думаю что это хорошая идея не делать этого, а также это не запрещено правилами. Поэтому я не считаю возможным, нужным или полезным отказаться от этого интересного и увлекательного занятия. Однако если модераторы решат что мои действия заслуживают наказания, приму назначенное мне наказание с честью и пребуду в великой печали до истечения его срока.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

в культурном месте потсанов не бывает. ведь Девелопмент - култьтурное место? и кару ты понесёшь страшную (демонических смех в фоне) :)

Pi ★★★★★
()
Ответ на: комментарий от Pi

>в культурном месте потсанов не бывает. ведь Девелопмент - култьтурное место? и кару ты понесёшь страшную (демонических смех в фоне) :)

Биореактор?

HappyCoder
()

кстати 0 это вообще круто,
как-то давно, в течении трёх дней искали ашипку "деления на 0",
оказалось, что некоторые триг. функции могут возвращать -0,
а в коде кто-то решил 'пооптимизировать' видимо и было условие
типа if (sign(x))..
ко всему на ia64 gdb отказывался показывать знак перед 0, 
наверное считал что 0 он и в африке 0 :)

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.