2010-08-10 2 views
3

Я работаю над назначением операционных систем для одного из моих летних классов. Учитель предоставил объектный файл, который предоставляет функции, имитирующие поведение драйвера дискового устройства. Затем мы должны написать 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++ интерпретирует мой код? Я пропустил что-то настолько мирское, что мне должно быть стыдно за себя?

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

+0

Вы пишете код C или код на C++? Если C++, то может ли DevFormat выбрасывать исключение C++? Или, возможно, он вызывает «longjmp» и возвращается к более ранней точке «setjmp»? Прекращается ли вся ваша программа? Если у вас есть доступ к исходному коду 'DevFormat', вы должны просто вставить его в отладчик. – jamesdlin

+4

Пожалуйста, уточните, что «Format() просто резко заканчивается, не возвращая значения». Что это значит? Сбой вашей программы? Также покажите определение функции/подпись DevFormat - ваш стек может быть поврежден. – carlsborg

+0

Segfault или что-то еще вызывает внезапное завершение работы в DevFormat(). Google не возвращает ничего для DevFormat(), поэтому вам нужно опубликовать источник или как его выводить. – 2010-08-10 22:39:40

ответ

14

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

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

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

+0

Во время этого комментария код кажется исправленным. – Javier

+0

Умм, что? У вопроса есть фигурные скобки, и нет никаких признаков того, что он был отредактирован ... почему это так поддержано? – rmeador

+0

@rmeador: Редактирование вопроса в течение первых пяти минут не считается «редактированием» и не отображается в истории редактирования. –

0

Это наверняка будет ошибкой, но я не вижу недостающих фигурных скобок в коде выше - был ли он отредактирован?

+0

Да, изначально действительно отсутствовали фигурные скобки. –

0

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

Смежные вопросы