Стив Саммит (Steve Summit) scs@eskimo.com
17.20 Почему не выполняется такой фрагмент?
char *p = "Hello, world!";
p[0] = tolower(p[0]);
О: Стринговые константы не всегда можно модифицировать, за исключением
случая, когда ими инициализируется массив. Попробуйте
char a[] = "Hello, world!";
(Для компиляции старых программ некоторые компиляторы имеют ключ,
который управляет возможностью модификации стринговых констант.)
См. также вопросы 2.1,2.2, 2.8 и 17.2.
Смотри: ANSI Разд. 3.1.4 .
17.21 Моя программа аварийно завершается еще до выполнения! (если
использовать отладчик, то видно, что смерть наступает еще до
выполнения первой инструкции в main).
О: Видимо, у Вас один или несколько очень больших (более килобайта)
локальных массивов. Во многих системах размер стека фиксирован,
а операционные системы, в которых осуществляется динамическое
выделение стековой памяти, (например, UNIX) могут быть введены в
заблуждение, когда размер стека резко увеличивается.
Часто предпочтительнее объявить большие массивы типа static(если,
конечно, каждый раз при рекурсивном вызове не требуется свежий
массив).
(См. также вопрос 9.4).
17.22 Что означают сообщения "Segmentation violation" и "Bus error" ?
О: Это значит, что программа пытается получить доступ к несуществующей
или запрещенной для нее области памяти. Это постоянно происходит
из-за неинициализированных или неверно инициалированных указателей
(см. вопросы 3.1, 3.2), по вине malloc (см. вопрос 17.23) или, может
быть, scanf (см. вопрос 11.3).
17.23 Моя программа аварийно завершается, очевидно, при выполнении malloc,
но я не вижу в ней ничего плохого.
О: К несчастью, очень легко разрушить внутренние структуры данных,
создаваемые malloc, а возникающие проблемы могут быть трудны для
отладки. Чаще всего проблемы возникают при попытке записать больше
данных, чем может уместиться в памяти, выделенной malloc; особенно
распространена ошибка malloc(strlen(s)) вместо strlen(s) + 1.
Другие проблемы включают освобождение указателей, полученных не
в результате выполнения malloc, или попытки применить функцию
realloc к нулевому указателю. (см. вопрос 3.12).
Существует несколько отладочных пакетов, чтобы помочь отследить
возникающие при применении malloc проблемы. Один из популярных -
"dbmalloc" Конора П. Кахилла, (Conor P. Cahill) помещенный в
comp.sources.misc в сентябре 1992. Другие - это "leak" помещенный в
том 27 архива comp.sources.unix, JMalloc.c и JMalloc.h в сборике
Fidonet Snippets (ищите с помощью archie; см. также вопрос 17.2); и
MEMDEBUG - см. ftp.crpht.lu в pub/sources/memdebug .
См. также вопрос 17.12.
17.24 Есть у кого-нибудь комплект тестов для С компилятора?
О: Плюм Холл (Plum Hall) (ранее работавший в Кардифе, Нью Джерси, теперь
Гаваи) продает такой комплект. Дистрибутив GNU C (gcc) от FSF
включает c-torture-test.tar.Z который выявляет многие проблемы,
возникающие при использованиии компиляторов. Тест Кагана (Kahan) под
названием paranoia, который находится в директории netlib/paranoia на
netlib.att.com интенсивно тестирует операции с плавающей точкой.
17.25 Где достать грамматику С для программы YACC?
О: Самая надежная - конечно же грамматика из стандарта ANSI. Другая
грамматика, подготовленная Джимом Роскиндом (Jim Roskind), находится
на ics.uci.edu в директории pub/*grammar*. Одетый в плоть,
работающий образец ANSI грамматики (принадлежащий Джефу Ли(Jeff Lee))
находится на uunet (см. вопрос 17.12) в директории
usenet/net.sources/ansi.c.grammar.Z (вместе с лексическим
анализатором). В компиляторе GNU C от FSF есть грамматика, так же как
есть она в приложении к книге K&R II.
Смотри: ANSI Разд. A.2 .
17.26 Мне необходим исходный текст для разбора и вычисления формул.
О: Есть два доступных пакета - "defunc" , помещенный в comp.source.misc
в декабре 1993 г. (V41 i32,33), в alt.sources в январе 1994 г.,
его можно получить через ftp sunsite.unc.edu в директории
pub/packages/development/libraries/defunc-1.3.tar.Z; и
пакет "parse" в lamont.ldgo.columbia.edu.
17.27 Мне необходима функция типа strcmp, но для приблизительного
сравнения, чтобы проверить две строки на близость, но не на
тождество.
О: Обычно такие сравнения включают алгоритм "soundex", который
ставит в соответствие сходно звучащим словам один и тот же числовой
код. Этот алгоритм описан в томе "Сортировка и поиск" классической
книги Дональда Кнута "Искусство программирования для ЭВМ".
17.28 Как по дате найти день недели?
О: Используйте mktime (см. вопросы 12.6 и 12.7) или соотношение
Зеллера (Zeller), или попробуйте вот эту функцию, помещенную Томохико
Сакамото (Tomohiko Sakamoto):
dayofweek(y, m, d) /* 0 = Воскресенье */
int y, m, d; /* 1 <= m <= 12, y > 1752 (примерно) */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
17.29 2000-й год будет високосным? (год %4 ==0) - правильный тест на
високосный год?
О: Да и нет соответственно. Вот полной тест для Григорианского
календаря:
year % 4 == 0 && (year % 100 != 0 // year % 400 == 0)
17.30 Как произносить "char"?
О: Ключевое слово С "char" можно произносит тремя способами:
как английские слова "char," "care," or "car;". Выбор за Вами.
17.31 Какие есть хорошие книги для изучения С?
О: Митч Райт (Mitch Wright) поддерживает аннотированную библиографию
книг по С и по UNIX; она доступна через ftp ftp.rahul.net в
директории pub/mitch/YABL.
17.32 Можно ли получить книги по С через Интернет?
О: Можно, по крайней мере, две:
"Notes for C programmers," Кристофера Соутелла,
(Christopher Sawtell) доступна через
svr-ftp.eng.cam.ac.uk:misc/sawtell_C.shar
garbo.uwasa.fi:/pc/c-lang/c-lesson.zip
paris7.jussieu.fr:/contributions/docs
"C for Programmers," Тима Лова (Tim Love)
доступна через
svr-ftp.eng.cam.ac.uk в директории misc.
17.33 Где найти другие варианты этих вопросов и ответов? Доступны
ли более ранние редакции?
О: Пошарьте по Сети. Обычно эти вопросы и ответы помещаются в
comp.lang.c первого числа каждого месяца, со значением поля Expires,
позволяющим присутствовать в comp.lang.c весь месяц. Там же
есть сокращенная версия, представляющая собой список изменений,
сопровождающий существенно обновленную версию. Такие списки можно
так же найти в comp.answers и news.answers. Несколько серверов ведут
архивы сообщений, помещаемых в news.answers, а также списков часто
задаваемых вопросов (FAQ), включая и этот. Вот два сервера
rtfm.mit.edu (директории pub/usenet/news.answers/C-faq/ и
pub/usenet/comp.lang.c/ ) и ftp.uu.net (директорий
usenet/news.answers/C-faq/ ). Сервер archie должен помочь найти
другие архивы; сделайти запрос на "prog C-faq". Дополнительную
информацию можно найти в списке meta-FAQ в news.answers; см. также
вопрос 17.12.
Этот документ - постоянныо расширяющийся список вопросов, которые
часто задавались со времен Великого Переименования, а не коллекция
вопросов, которые были интересны в этом месяце. Предыдущие версии
этого документа устарели, и в них нет ничего интересного за
исключением случайных орфографических ошибок, которых в данной версии
уже нет.
Библиграфия
ANSI American National Standard for Information Systems --
Programming Language -- C, ANSI X3.159-1989 (см. вопрос 5.2).
JLB Jon Louis Bentley, Writing Efficient Programs, Prentice-Hall,
1982, ISBN 0-13-970244-X.
H&S Samuel P. Harbison and Guy L. Steele, C: A Reference Manual,
Second Edition, Prentice-Hall, 1987, ISBN 0-13-109802-0.
(скоро появится третье издание.)
PCS Mark R. Horton, Portable C Software, Prentice Hall, 1990,
ISBN 0-13-868050-7.
EoPS Brian W. Kernighan and P.J. Plauger, The Elements of Programming
Style, Second Edition, McGraw-Hill, 1978, ISBN 0-07-034207-5.
Русский перевод: Б.Керниган,Ф.Плоджер "Элементы стиля
программирования", Радио и связь, 1984, 160 стр.
K&R I Brian W. Kernighan and Dennis M. Ritchie, The C Programming
Language, Prentice-Hall, 1978, ISBN 0-13-110163-3.
Русский перевод: Керниган Б., Ритчи Д. "Язык программирования
С", М.: Финансы и статистика,1985.
K&R II Brian W. Kernighan and Dennis M. Ritchie, The C Programming
Language, Second Edition, Prentice Hall, 1988, ISBN 0-13-
110362-8, 0-13-110370-9.
Русский перевод:Б.Керниган, Д.Ритчи "Язык программирования С",
М.: Финансы и статистика, 1992.
Knuth Donald E. Knuth, The Art of Computer Programming, (3 vols.),
Addison-Wesley, 1981.
Русский перевод: Д.Кнут "Искусство программирования для ЭВМ",
т.1 Основные алгоритмы (М.:Мир,1976),т.2 Получисленные алгоритмы
(М.:Мир,1977), т.3 "Сортировка и поиск", (М.:Мир, 1978)
CT&P Andrew Koenig, C Traps and Pitfalls, Addison-Wesley, 1989,
ISBN 0-201-17928-8.
P.J. Plauger, The Standard C Library, Prentice Hall, 1992,
ISBN 0-13-131509-9.
Harry Rabinowitz and Chaim Schaap, Portable C, Prentice-Hall,
1990, ISBN 0-13-685967-4.
Более подробную библиографию можно найти в переработанном руководстве
по стилю Indian Hill (см. вопрос 14.3, а также вопрос 17.31).
Благодарности
Спасибо следующим людям:
Jamshid Afshar, Sudheer Apte, Randall Atkinson, Dan Bernstein,
Vincent Broman, Stan Brown, Joe Buehler, Gordon Burditt, Burkhard Burow,
Conor P. Cahill, D'Arcy J.M. Cain, Christopher Calabrese, Ian Cargill,
Paul Carter, Billy Chambless, Raymond Chen, Jonathan Coxhead, Lee
Crawford, Steve Dahmer, Andrew Daviel, James Davies, Jutta Degener, Norm
Diamond, Jeff Dunlop, Ray Dunn, Stephen M. Dunn, Michael J. Eager, Dave
Eisen, Bjorn Engsig, Chris Flatters, Rod Flores, Alexander Forst, Jeff
Francis, Dave Gillespie, Samuel Goldstein, Alasdair Grant, Ron
Guilmette, Doug Gwyn, Tony Hansen, Joe Harrington, Guy Harris, Elliotte
Rusty Harold, Jos Horsmeier, Blair Houghton, Ke Jin, Kirk Johnson, Larry
Jones, Kin-ichi Kitano, Peter Klausler, Andrew Koenig, Tom Koenig, Ajoy
Krishnan T, Markus Kuhn, John Lauro, Felix Lee, Mike Lee, Timothy J.
Lee, Tony Lee, Don Libes, Christopher Lott, Tim Love, Tim McDaniel,
Stuart MacMartin, John R. MacMillan, Bob Makowski, Evan Manning, Barry
Margolin, George Matas, Brad Mears, Bill Mitchell, Mark Moraes, Darren
Morby, Ken Nakata, Landon Curt Noll, David O'Brien, Richard A. O'Keefe,
Hans Olsson, Philip (lijnzaad@embl-heidelberg.de), Andrew Phillips,
Christopher Phillips, Francois Pinard, Dan Pop, Kevin D. Quitt, Pat
Rankin, J. M. Rosenstock, Erkki Ruohtula, Tomohiko Sakamoto, Rich Salz,
Chip Salzenberg, Paul Sand, DaviD W. Sanderson, Christopher Sawtell,
Paul Schlyter, Doug Schmidt, Rene Schmit, Russell Schulz, Patricia
Shanahan, Peter da Silva, Joshua Simons, Henry Spencer, David Spuler,
Melanie Summit, Erik Talvola, Clarke Thatcher, Wayne Throop, Chris
Torek, Andrew Tucker, Goran Uddeborg, Rodrigo Vanegas, Jim Van Zandt,
Wietse Venema, Ed Vielmetti, Larry Virden, Chris Volpe, Mark Warren,
Larry Weiss, Freek Wiedijk, Lars Wirzenius, Dave Wolverton, Mitch
Wright, Conway Yee, и Zhuo Zang, кто явно или неявно внес вклад в этот
документ.
Отдельно хочу поблагодарить Карла Хойера (Karl Heuer) и в особенности
Марка Бредера (Mark Brader), кто, говоря словами Стива Джонсона,
(Steve Johnson) "в безжалостном стремлении улучшить этот документ
уводил меня не только за пределы моих желаний, но и за пределы
моих возможностей".
Авторские права на этот документ принадлежат Стиву Саммиту (Steve Summit),
1988, 1990-1995. Документ можно свободно распространять пока в нем
присутствует имя автора и эти строки. Отрывки С программ в этом документе
(vstrcat(), error(), и т.д.) относятся к общедоступным и могут использоваться
без ограничений.
Окончание.