Russian Qt Forum
Ноябрь 27, 2024, 15:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разобрать исходные коды  (Прочитано 5248 раз)
jatsuk
Гость
« : Май 22, 2011, 06:46 »

Препод замучил.... нужно разобраться как работает функция feof. И не просто сказать что она возвращает, в каких случаях, а ПРЯМ в исходном коде функции показать где это выполняется.
Скачал я glibc-2.3.4 и нашел там исходный код.

Код:
#include "libioP.h"
#include "stdio.h"

int
_IO_feof (fp)
     _IO_FILE* fp;
{
  int result;
  CHECK_FILE (fp, EOF);
  _IO_flockfile (fp);
  result = _IO_feof_unlocked (fp);
  _IO_funlockfile (fp);
  return result;
}

#ifdef weak_alias
weak_alias (_IO_feof, feof)

#ifndef _IO_MTSAFE_IO
#undef feof_unlocked
weak_alias (_IO_feof, feof_unlocked)
#endif
#endif

Мне понять из этого как работает очень сложно.
Понятно только одно здесь прямо это не выполняется (возвращает не нулевой символ если конец, а если конец, то 0 вроде)
Так вопрос, а в какой вообще функции идет это сравнение , возвращение Непонимающий
я так понял  result = _IO_feof_unlocked (fp); здесь возвращается. Где тогда найти саму функцию _IO_feof_unlocked сеё исходным кодом.

А Если есть какая нибудь книжечка с полным описанием исходных кодов, подскажите ??
Записан
Fat-Zer
Гость
« Ответ #1 : Май 22, 2011, 13:09 »

_IO_feof_unlocked - это не функция, это макрос... как найти - воспользуйся поиском...
А Если есть какая нибудь книжечка с полным описанием исходных кодов, подскажите ??
есть только документация идущая с библиотекой...
Записан
jatsuk
Гость
« Ответ #2 : Май 22, 2011, 13:35 »

_IO_feof_unlocked искал
много раз искал, по тексту ...
находит только libio.h, feof_u.c,feof.c, stdio.h

что за документация, вроде там не было...
Записан
jatsuk
Гость
« Ответ #3 : Май 22, 2011, 14:10 »

всё что есть

#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
Записан
Fat-Zer
Гость
« Ответ #4 : Май 22, 2011, 14:40 »

что за документация, вроде там не было...
папка manual, но она в ТеХе, её нужно собрать...
#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
тогда чего здесь не понятного? если флаг установлен, то возвращается труъ
Записан
jatsuk
Гость
« Ответ #5 : Май 22, 2011, 14:52 »

Папки мануал нет  Обеспокоенный
ну да ладно

вторая функция getc, она должна возвращать EOF если конец

#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
   ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

но где тут это ?? я только понял , что сравнивает указатель чтения сейчас и конца и возвращает 0.А в конце указатель передвигается. А EOF нет (

Записан
Fat-Zer
Гость
« Ответ #6 : Май 22, 2011, 15:21 »

Папки мануал нет  Обеспокоенный
ну да ладно
не заметил, что версия древняя... может там и нет... тогда можно посмотреть в онлайне на оф.сайте.

вторая функция getc, она должна возвращать EOF если конец

#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
   ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

но где тут это ?? я только понял , что сравнивает указатель чтения сейчас и конца и возвращает 0.А в конце указатель передвигается. А EOF нет (
всё же ведь написано: если указатель чтения >= вернего указателя буфера, то вызвать __uflow, которая будет делпть чёрную работу, иначе вернуть указатель на текущий символ и увеличить указатель чтения.
Записан
jatsuk
Гость
« Ответ #7 : Май 22, 2011, 16:00 »

Спасибо за всё. Завтра поищу новую версию...
С Eof так и не понял  Обеспокоенный
Записан
Fat-Zer
Гость
« Ответ #8 : Май 22, 2011, 16:02 »

С Eof так и не понял  Обеспокоенный
смотрите код __uflow()
Записан
jatsuk
Гость
« Ответ #9 : Май 24, 2011, 08:12 »

А что такое

  int result;
  CHECK_FILE (fp, EOF); НепонимающийНепонимающий
  _IO_flockfile (fp);
  result = _IO_feof_unlocked (fp);
  _IO_funlockfile (fp);
  return result;

Записан
brankovic
Гость
« Ответ #10 : Май 24, 2011, 10:01 »

А что такое
  CHECK_FILE (fp, EOF); НепонимающийНепонимающий

проверяет что fp не ноль и грубо, что он вообще валидный. Чего вы хотите-то разобраться досконально прям? Тогда всё в исходниках есть. Но ИМХО постановка (со стороны преподавателя) более чем странная.
Записан
gogi
Гость
« Ответ #11 : Май 24, 2011, 10:42 »

Скачал я glibc-2.3.4
Ничего по-ископаемее не нашёл?
Записан
jatsuk
Гость
« Ответ #12 : Май 25, 2011, 06:01 »

Я лично не хочу в этом разбираться   Улыбающийся но приходится
Чек файла в исходниках не нашел...

А скачал, что было на серваке кафедры Смеющийся
Записан
jatsuk
Гость
« Ответ #13 : Май 25, 2011, 06:13 »

Вот что получилось с функцией getc

Код:
 result = _IO_getc_unlocked (fp); (getc.с)

этот макрос в libio.h

Код:
#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

далее __uflow genops.c
Код:
int
__uflow (fp)
     _IO_FILE *fp;
{
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
  if (_IO_vtable_offset (fp) == 0 && _IO_fwide (fp, -1) != -1)
    [b]return EOF;[/b]
#endif

  if (fp->_mode == 0)
    _IO_fwide (fp, -11);
  if (_IO_in_put_mode (fp))
    if (INTUSE(_IO_switch_to_get_mode) (fp) == EOF)
     [b] return EOF;[/b]
  if (fp->_IO_read_ptr < fp->_IO_read_end)
    return *(unsigned char *) fp->_IO_read_ptr++;
  if (_IO_in_backup (fp))
    {
      _IO_switch_to_main_get_area (fp);
      if (fp->_IO_read_ptr < fp->_IO_read_end)
return *(unsigned char *) fp->_IO_read_ptr++;
    }
  if (_IO_have_markers (fp))
    {
      if (save_for_backup (fp, fp->_IO_read_end))
[b]return EOF;[/b]
    }
  else if (_IO_have_backup (fp))
    INTUSE(_IO_free_backup_area) (fp);
  return _IO_UFLOW (fp);
}
libc_hidden_def (__uflow)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 21.