Какая часть этого вызывает исключение с плавающей запятой?

Я был бы очень признателен, если бы люди могли просмотреть этот фрагмент кода и сообщить мне, что может быть возможной причиной исключения с плавающей запятой.

Информация:

  • ветки - это размер массива int 200
  • строка представляет собой размер массива символов 20
  • Цикл работает нормально 6 раз, затем возникает исключение.

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

    for (count = 0; count < sizeof(branches); count++){

    if (fgets(line,sizeof(line),fp)==NULL)
     break;
    else {

    int branch_taken = line[16] - 48; 

    branches[count] = branch_taken;
     }   
    }

person franka    schedule 22.10.2012    source источник
comment
В какой строке выдается исключение? Может ли быть так, что цикл завершен, а исключение выброшено в другом месте?   -  person eggyal    schedule 24.10.2012


Ответы (1)


sizeof(branches) — это размер в байтах. Вам нужно использовать константу, которая представляет количество элементов, то есть 200, иначе вы превысите границы вашего массива branches, что приведет к привести к неопределенному поведению.

Ваш код, вероятно, должен выглядеть примерно так:

#define NUM_BRANCHES 200

int branches[NUM_BRANCHES];

for (count = 0; count < NUM_BRANCHES; count++)
{
    ...
person Paul R    schedule 22.10.2012
comment
@Ник: ИТИМ sizeof(branches) / sizeof(branches[0]) ? - person Paul R; 22.10.2012
comment
Большое спасибо; никогда бы не понял этого. - person franka; 22.10.2012
comment
@DanielFischer Ну, есть UB из-за доступа за пределами границ. Так что можешь считать FPE причиной :P - person P.P; 22.10.2012
comment
@Daniel Fischer: если у вас есть UB, то никаких дополнительных объяснений не требуется. - person Paul R; 22.10.2012
comment
Бьюсь об заклад, код позже делится на входное значение. Поскольку он выходит за пределы, он, вероятно, перезаписывается нулем. - person Mysticial; 22.10.2012
comment
@DanielFischer Это не так, но именно поэтому цикл случайным образом останавливается после 6 итераций, даже если FPE находится где-то еще в программе. - person franka; 22.10.2012
comment
@KingsIndian Если исключение возникает после того, как count стало >= 200 (как я подозреваю), то да, UB (но, конечно, все равно интересно, если компилятор выбирает необычный способ). Но если это действительно произойдет после шести итераций, это слишком рано. - person Daniel Fischer; 22.10.2012
comment
@FSchmidt Если цикл останавливается после шести итераций, причина должна быть внутри цикла (если только авторы компилятора не изо всех сил старались обнаружить, что программа вызовет UB, и решили немного повеселиться, вылетев ранее - или вы предыдущий УБ). Вероятно целочисленное деление на 0. - person Daniel Fischer; 22.10.2012
comment
Нашел деление на 0, (путь) вне цикла. Я предполагаю, что это означает, что авторы компилятора повеселились. ^^ - person franka; 22.10.2012
comment
@FSchmidt Или я неправильно истолковал ваш цикл шесть раз. Если это означает, что цикл завершается шесть раз, у вас уже был UB во время первого запуска. Я думал, что это означает, что он работает нормально для count = 0 .. 5 и вылетает, когда count == 6, но теперь я склонен думать, что имеет место первая интерпретация. - person Daniel Fischer; 22.10.2012