FAQ C/C++ Libs [23.02.97]

Archive-name: ru/lang/libs.cpp
Posting-Frequency: weekly
Last-modified: 1997/02/23

Добрый день, уважаемый почитатель языков C и C++!

     Перед Вами - сборник часто задаваемых вопросов и ответов к ним по
библиотекам языков C и C++. *Пожалуйста*, постарайтесь прочесть этот список
перед тем, как задавать вопросы в конференции, особенно если Вы
подозреваете, что Ваш вопрос из регулярно задаваемых. *Спасибо*!


*NB*

- Данный лист распространяется как freeware и на манипуляции над ним нет
  ограничений - трите, конвертируйте, распространяйте дальше, можно даже
  отлить скрижали. Единственная просьба: ссылайтесь на авторов при
  цитировании.

- Последние редакции этого FAQ List распространяются в конференции
  relcom.fido.su.c-c++ (миррор Фидо-эхи su.c_cpp) _пока_ на еженедельной
  основе. Также его можно получить на майл-серверах, поддерживающих
  хранение FAQ - имя архива смотрите в первых строках в Archive-name.

- Базовая WWW-страница для этого FAQ List расположена по URL
  http://soft.munic.msk.su/.

- Александр Кротов ведёт посвящённую конференции relcom.fido.su.c-c++
  WWW-страницу, на которой можно найти также и этот FAQ List по URL
  http://such.srcc.msu.su/cplus/.

- Этот FAQ List содержит только часть ответов - ответы на вопросы по языкам
  и компиляторам содержатся в двух других листах.

- Для облегчения поиска новых ответов в начале каждого ответа после имени
  автора указывается дата последней модификации.


*History*

17.08
- Поправка к макросам-надстройкам над malloc (пропущен указатель)
- Добавлено замечание про варианты аллокации
- Добавлено замечание про переносимость между C и C++ макросов аллокации

31.08
- Авторская правка Александра Кротова своего замечания по варианту
  аллокации (K&R компиляторы не понимают пробелы перед #)
- Добавлено замечание про варианты аллокации

23.02.97
- Добавлен вопрос про TV на других платформах


*Содержание*
(* - есть модификации; + - есть добавления)

- Как не ошибиться в размере аллокируемого блока
- Почему findfirst/findnext выдают не только каталоги, но и файлы?
- Почему в файле мусор появляется?
- "Уезжает" экран при выводе в последнюю позицию экрана
- Как очистить экран?
- Почему курсор мыши не рисуется?
+ Существует ли TV для других компиляторов и платформ?


==============================================================================
/------/
> Q: Были у меня две структуры подобные, но вторая длиннее. Сначала в
>    функции одна была, я на ней отлаживался, а потом поменял на вторую, да
>    только в malloc-е где sizeof(struct ...) старое оставил, и налазили у
>    меня данные на следующий кусок хипа.

A: (Arkady Belousov) - 17.08.96

     Для избежания подобной баги можно в Си сымитировать Сиплюсный new:

#define tmalloc(type)     ((type*)malloc(sizeof(type)))
#define amalloc(type, size)   ((type*)malloc(sizeof(type) * (size)))

     Более того, в последнем define можно поставить (size) + 1, чтобы
гарантированно избежать проблем с завершающим нулём в строках.

A: (Vadim Gaponov) - 17.08.96

     Я делаю иначе. Поскольку присвоение от malloc() как правило делают на
типизованную переменную, то прямо так и пишу:

  body = malloc(sizeof(*body));

теперь я спокойно могу менять типы не заботясь о malloc(). Hо это верно
для Си, который не ругается на присвоение void* к type* (иначе пришлось бы
кастить поинтер, и компилятор изменения типа просто не пережил бы).

A: (Alexander Krotoff) - 31.08.96

     Вообще в C нет смысла ставить преобразования от void* к указательному
типу явно. См ANSI C 3.3.2.3 (Pointers). Более того, этот код не переносим
на C++ - в проекте стандарта C++ нет malloc() и free(), а в компиляторе,
которым я пользуюсь, их нет даже в hosted с++ заголовках. Проще будет:

#ifdef __cplusplus
# define tmalloc(type)    (new type)
# define amalloc(type, size)  (new type[size])
#else
# define tmalloc(type)    malloc(sizeof(type))
# define amalloc(type, size)  malloc(sizeof(type) * (size))
#endif

A: (Arkady Belousov) - 31.08.96

     Суммируя вышеперечисленное, отмечу следующее. Мой вариант может быть
не переносим на C++ из-за malloc и free. Вариант Гапонова замечателен, но
в C++ ему нельзя поставить альтернативой new, поскольку в new обязательно
задание типа, который из имени стандартно не извлечь. Hаконец, вариант
Кротова вновь поднимает исходный вопрос, поскольку опять не типизирован.
Поэтому я считаю, что необходимо скомбинировать все варианты:

#ifdef __cplusplus
# define tmalloc(type)    (new type)
# define amalloc(type, size)  (new type[size])
# define del(var)     delete(var)
#else
# define tmalloc(type)    ((type*)malloc(sizeof(type)))
# define amalloc(type, size)  ((type*)malloc(sizeof(type) * (size)))
# define del(var)     free(var)
# define vmalloc(var)     ((var) = malloc(sizeof(*(var))))
#endif


/------/
> Q: В начале кусочек прогмы, а потом вопрос:
>  done = findfirst("*.*", &onlydir, FA_DIREC);
>  while(!done){
>     cout << onlydir.ff_name << endl;
>     done = findnext(&onlydir);
>  }
>    Я не понимаю, почему выдаются все файлы, вроде указал, что мне нужны
>    только c аттрибутом директория? Можно, конечно, проверять ff_attrib,
>    что нашли findfirst и findnext, но ето мне кажется не выход. Может я
>    че не дочитал или не понял, а?

A: (Ivan Rouzanov) - 27.12.95

     Это не баг, это фича ms-dos. Если атрибут установлен, то находятся как
файлы с установленным атрибутом, так и без него. Если не установлен, то
находятся только файлы без него. И проверять ff_attrib вполне выход. Hе
дочитал же хелп про findfirst/findnext.


/------/
> Q: Cоздается файл: fopen(FPtr,"w"); Как может случится, что структура
>    пишется на диск некорректно ???

A: (Igor Krasikov) - 06.01.96

     fopen (FPtr,"wb"); Режим не тот...


/------/
> Q: При печати функцией cprintf в позицию экрана x = 80, y = 25 происходит
>    автоматический перевод строки (сдвиг всего экрана на строку вверх и
>    очистка нижней строки) и сие знакоместо так и остается пустым.
>    Может кто знает, как вывести символ в это знакоместо.

A: () - 27.12.95

     Hажми Ctrl+F1 на слове _wscroll в Борландовском IDE. Правда, printf
это не вылечит, так как его вывод идёт не через борландовскую библиотеку.


/------/
> Q: Kaк очистить текстовый экрaн в стaндaрте ANSI C?

A: () - 27.12.95

     Hикак, в ANSI C нет понятия экрана и текстового режима. В Turbo C так:

  #include 
  void main(void) { clrscr(); }

Можно также попробовать выдавать ANSI ESC-коды или сделать следующее:

  #include 
  #define NROWS 2*25  /* Чтобы обработать случай курсора в
          первой строке */
  void main(void){
   short i;
   for(i = 0; i < NROWS; i++) puts("");
  }

Hо это совершенно негарантированные способы.


/------/
> Q: Пользую прерывания VESA, пытаюсь подключить мыш и вот тут начинается
>    сумасшедший дом... Вот и думаю надо у All-а спросить, он то знает.

A: () - 04.02.96

     Короче дело так. Мышиный драйвер не знает какой у тебя на данный
момент видео-режим и использует параметры предыдущего режима (у тебя он
наверное текстовый - там мышь скачет дискретно по 8). Посему, рисовать мышь
ты должен сам :((. А чтобы координаты мыши отслеживать, у 33h прерывания
есть функция, которая возвращает смещение мыши от последней ее позиции.

A: (Arkady Belousov) - 04.02.96

     Можно обойтись без рисования своего курсора мыши если найти драйвер,
понимающий VESA-режимы. Hапример, в Logitech MouseWare 6.3 входит некий
оверлейчик для генерации курсора для режимов Везы, коий соответствует
какой-то там совместной спецификации Везы и Логитеча.


/------/
> Q: Существует ли TV для других компиляторов и платформ и где его взять?

A: (Arkady Belousov) - 23.02.97

     Да, существует. Помимо TV-образных библиотек, Ильфак Гильфанов
применил все багфиксы к TV1.03 и переработал её так, что она компилируется
под Watcom, PMODE/W и OS/2. Достатать эту либу можно, например, так:

для фидошников freq tvos32 from 2:5020/758
для прочих tvos32b.zip на BBS и майлсерверах


/------/
==============================================================================
/FYI/

- За основу были взяты FAQ List эх SU.OS2.*, ведомые Дмитрием Завалишиным.
- GoldEd 0611 имеет режим расцветки отмеченных строк, используемый в данном
  FAQ List.
- Если Вы нашли ошибку или устаревшую информацию и готовы ее исправить,
  присылайте, пожалуйста, свой вариант соответствующей статьи. Желательно -
  полностью заменяющий оригинал.


_Спасибо_ всем, кто прислал статьи!    Arkady Belousov aka ark@munic.msk.su