Функция резко возвращается, когда она не должна - PullRequest
3 голосов
/ 11 августа 2010

Я работаю над заданием «Операционные системы» для одного из моих летних занятий. Учитель предоставил объектный файл, который предоставляет функции, которые имитируют поведение драйвера дискового устройства. Затем мы должны написать API файловой системы, который использует драйвер дискового устройства на языке C.

Я работаю над функцией форматирования моей файловой системы с именем Format (), которая вызывает функцию с именем DevFormat () из объектного файла учителя. Моя функция должна вернуть 1, если она смогла успешно отформатировать файловую систему, и 0 в противном случае. DevFormat () возвращает 1, если удалось успешно отформатировать диск, и 0 в противном случае. Вот код:

int Format()
{
    if (!DevFormat())
    {
        printf("Disk drive wasn't formatted successfully\n");
        return 0;
    }

    <Do some stuff to the file system here>

    printf("File system successfully formatted\n");
    return 1;
}

Моя проблема в том, что Format () просто внезапно завершается без возврата значения. Я обнаружил, что оскорбительным фрагментом кода является строка: if (!DevFormat()). Сейчас я пишу задание на C, но использую компилятор GNU C ++ (g ++) для компиляции и компоновки моего проекта, как сказал учитель. Я хочу сказать, что причина, по которой Format () внезапно заканчивается, когда строка if (!DevFormat()) выполняется, связана с интерпретацией моего кода компиляторами (я мог бы быть очень далек. Это всего лишь предположение). Я обнаружил, что моя функция также внезапно заканчивается, если я изменил код на if (0 == DevFormat()). Единственный способ проверить наличие ошибок - присвоить возвращаемое значение DevFormat () переменной int и проверить это.

Любая помощь будет высоко ценится. Это как-то связано с тем, как компилятор C ++ интерпретирует мой код? Разве я пропустил что-то настолько обыденное, что мне должно быть стыдно за себя?

Еще раз спасибо за помощь.

Ответы [ 3 ]

14 голосов
/ 11 августа 2010

Я думаю, что, возможно, вы забыли скобки вокруг своего оператора if - я думаю, вы хотели написать это:

if (!DevFormat()) {
    printf("Disk drive wasn't formatted successfully\n");
    return 0;
}

Внутри блока if был только оператор printf, поэтому оператор return выполнялся каждый раз независимо от возвращаемого значения DevFormat (). Это обычная ошибка в C:)

0 голосов
/ 11 августа 2010

Попробуйте скомпилировать с gcc -fno-exceptions и посмотрите, изменит ли это что-нибудь. (Рекомендуйте библиотеку тоже, чтобы быть уверенным.) Кроме того, я второй запрос @ tholomew для уточнения "Format () просто внезапно заканчивается, не возвращая значение.".

0 голосов
/ 11 августа 2010

Это, безусловно, будет ошибкой, но я не вижу пропущенных скобок в приведенном выше коде - это было отредактировано?

...