Слово
«maxlength»впервые сказано пользователем
jiffy 14.10.2011 в 19:10,
и с тех пор употреблялось
18 раз.
Сообщения со словом
«maxlength»
Запрос выполнился за
0.0058 сек.
- 14.10.2011, 19:43. jiffy в теме
«The C Programming Language.»
... in a word define out 0 state not in a word define maxlength 40 maximal length of a word longer words are ignored это как вы наверное уже знаете так называемые макроопределения в общем случае программа состоит из нескольких файлов с расширением с исходные коды и файлов с расширением h заголовочных файлов в упрощенном виде преобразование этого набора файлов в исполняемую программу проходит следующие этапы http en wikipedia org wiki translation unit programming 1 препроцессирование preprocessing на выходе так называемые translation unit 2 компиляция compilation компиляция translation units на выходе оbject files 3 связывание linking на выходе исполняемая программа executable program нас интересует первый этап препроцессирование препроцессированием занимается препроцессор препроцессор языка с и объекты называемые макросами штука до того не любимая отцом-основателем с б страуструпом что он не раз признавался на страницах своих книг что он всеми силами хотел и наверное до сих пор хочет застать то время когда препроцессор с с его макросами канет в лету для подобного отношения существуют очень веские основания однако избавиться от препроцессора окончательно не удалось ни в с ни в с и не получится потому что препроцессор и макроподстановки описаны и закреплены стандартом макросы провоцируют ошибки их тяжело писать крайне сложно и неприятно отлаживать тем не менее это исключительно мощное и как мне кажетс изящное средство если коротко это не совсем верно но пока на данном этапе достаточно макроподстановка заключается в следующем препроцессор берет макрос и делает контекстную замену в с -шной программе к чему это все а вот к чему у нас есть вот такое определение и чуть ниже такой цикл код define maxlength 40 maximal length of a word longer words are ignored int lengths maxlength for i 0 i maxlength i lengths i 0 еще до компиляции на этапе...
- 14.10.2011, 19:10. jiffy в теме
«The C Programming Language.»
... in a word define out 0 state not in a word define maxlength 40 maximal length of a word longer words are ignored prints a vertical histogram of the lengths of words in the input int main void int i j c state wl int nmax int lengths maxlength state out wl 0 nmax 0 for i 0 i maxlength i lengths i 0 while c getchar eof if c c t c n if state in state out if wl maxlength lengths wl else printf nwarning word longer than d symbols n maxlength wl 0 else if state out state in wl for i 1 i maxlength i if lengths i nmax nmax lengths i printf n for i nmax i 0 --i printf for j 1 j maxlength j if lengths j i printf else printf printf n printf for i 1 i maxlength i printf 2d i return 0 ну скомпилировал я ее повводил слова пора думаю что-нибудь нарисовать и поскольку запустил ее в linux нажал на ctrl d чтобы ввести eof ничего не произошло до чего дошел прогресс думаю уже терминалы в x-windows стали настраивать так что они базовые управляющие символы не понимают вбил тестовую прогу состоящую из getchar ан нет все в порядке с терминалами и спустя некоторое время нашел в чем дело обратите внимание на следующие объявления в программе код int i j c state wl int nmax int lengths maxlength и на этот цикл код for i 0 i maxlength i lengths i 0 maxlength определено как 40 не совсем здорово кстати определено но мы к этому позже вернемся вопрос какие индексы являются допустимыми при обращении к элементам массива lengths ответ все целые числа от 0 до 39 включительно в диапазоне от 0 до 39 содержится ровно сорок 40 целых чисел ровно столько сколько мы определили в maxlength поэтому цикл код for i 0 i maxlength i lengths i 0 ошибочен ошибка в том что перебираются все целые числа от 0 до 40 включительно и таким образом мы обнуляем в цикле число типа int следующее сразу за последним элементом массива length а последний элемент массива это length 39 теперь почему же в моем случае я не попадал в цикл while где вызывается getchar и в связи с этим я не мог ввести eof а вот почему это ей-богу весьма примечательное и весьма поучительное обстоятельство смотрите попав в цикл код for i 0 i maxlength i lengths i 0 переменная i изменялась от 0 до 40 включительно и на последнем шаге цикла мы присваивали length 40 значение 0 shit happens именно в этой ячейке памяти лежала локальная переменная i счетчик цикла определенная в начале функции main то есть выполняя length 40 0 мы обнуляли переменную i дале выполнялось пост-условие цикла for а именно i переменная i становилась равной 1 мы переходили к проверке условия цикла и оно сюрприз выполнялось 1 40 соответственно мы попадали в бесконечный цикл и до while c getchar я просто не доходил вот эта ошибка адресация к неверному участку памяти одна из самых часто встречающихся и одна же из самых опасных чаще ее делают правда работая напрямую с указателями как эту проблему решить можно ее решать несколькими способами например можно считать что по индексу 0 лежат слова длины 1 по индексу 1 лежат слова длины 2 и т д однако это не очень здорово потому что неестественно гораздо проще объявить массив так код int lengths maxlength 1 в этом случае в ячейку lengths 0 ничего...