adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
По мере отладки программы вы изучите как специфические для
языка конструкции, которые могут приводить к неприятностям, так и
более общие ошибки программирования, которые вы сделали. Это зна-
ние можно использовать в последующем, чтобы постараться избежать
повторения таких ошибок. Кроме того, это послужит хорошей базой
для того, чтобы быстрее обнаруживать ошибки в следующих програм-
мах, которые вы будете писать.
Здесь важно понимать, что собой представляет каждая ошибка:
относится ли она к общим ошибкам или вызвана непониманием. Это
улучшит ваши возможности по разработке кода без ошибок. Кроме то-
го, всегда лучше писать программу без ошибок, чем уметь быстро
потом их исправлять.
Общие ошибки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В следующий примерах кратко охватываются различные типы оши-
бок, которые могут встречаться в ваших программах.
Скрытые эффекты
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Иногда вызов функции может приводить к неожиданным результа-
там:
char workbuf[20];
strcpy(workbuf, "all done\n");
convert("xyz");
print(workbuf);
...
convert(char *p) {
strcpy(workbuf, p);
while (*p)
...
}
Здесь правильнее было бы использовать в функции свой собс-
твенный рабочий буфер (workbuf).
Предположения об инициализации данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Иногда вы предполагаете, что другая функция уже установила
TDeb 3.0 #2-3 = 125 =
для вас какие-то значения:
char *workbuf;
addworkstring(char *s)
{
strcpy(workbuf, s);
}
Надежнее будет записать эту подпрограмму, добавив оператор:
if (workbuf == 0) workbuf = (char *)malloc(20);
Не забывайте об очистке
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Этот тип ошибки может привести к тому, что ваша программа
будет долго работать, но в конце-концов исчерпает динамически
распределяемую область памяти и аварийно завершит работу:
crunch_string(char *p)
{
char *word = (char*)malloc(strlen(p));
ctrcpy(work,p);
...
return(p)
}
"Забор и столбы"
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Этот тип ошибок аналогичен следующему. Сколько столбов пона-
добиться, чтобы построить 100-метровую изгородь,если столбы нужно
ставить через каждые 10 метров? Напрашивается ответ 10, но он не-
верен, так как в расчет принимается последний столб в конце забо-
ра. Приведем простой пример из программирования на Си:
for (n = 1; n < 10; n++)
{
... /* выполняется только 9 раз */
}
Здесь ясно видны числа 1 и 10, и вы можете подумать, что
цикл будет выполняться от 1 до 10. Чтобы это действительно было
так, нужно вместо < указать <=.
Ошибки, специфические для языка Си
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В "Руководстве пользователя" по Си и С++ есть раздел о не-
достатках программирования на Си. Однако лучше всего изучать эту
TDeb 3.0 #2-3 = 126 =
тему во время отладки.
Компиляторы Borland Си и Borland C++ прекрасно подходит для
того, чтобы находить многие из специфических для языка Си ошибок,
о которых другие компиляторы вам даже не сообщают. "Включив" в
компиляторе все предупреждающие сообщения, которые он может гене-
рировать, вы сэкономите время, необходимое для отладки программы.
(О том, как задавать уровень предупреждений, рассказывается в
"Руководстве пользователя по Borland C++".)
Далее мы приведем далеко не полный перечень возможных ошибок
при использовании языка Си. Для некоторых из них Borland Си и
Borland C++ генерирует предупреждающие сообщения. Не забудьте
найти причину вывода всех предупреждающих сообщений, поскольку
они могут быть вызваны возможной допущенной вами ошибкой.
Использование неинициализированных локальных переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В языке Си динамические локальные переменные, описанные
внутри функции, будут иметь неопределенное значение, пока вы что-
нибудь в них не загрузите. Например:
do_ten_times()
{
int n;
while (n < 10)
{
...
n++;
}
}
Данная функция будет выполнять цикл while неопределенное чис-
ло раз, так как перед использованием в качестве счетчика n не
инициализируется значением 0.
Не следует путать = и ==
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В выражениях язык Си позволяет использовать как присваивание
(=), так и проверку на равенство (==). Например:
if (x = y) {
...
}
При этом y будет ошибочно загружено в x, а оператор выпол-
нится, если значение y не равно 0. Вероятно, вы предполагали на-
писать следующее:
if (x == y)
...
TDeb 3.0 #2-3 = 127 =
Не следует путать старшинство операций
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В языке Си так много операций, что иногда легко спутать, ка-
кая из них применяется первой, когда выражение содержит несколько
операций. Одна из наиболее общих ошибок состоит в неправильном
выполнении комбинации операции сдвига и операции сложения или вы-
читания. Например:
x = 3 << 1 + 1
Если << указывается перед +, то при вычислении этого опера-
тора будет получено значение 12, а не 7, как можно было бы ожи-
дать.
Неверные арифметические действия с указателями
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда вы освоитесь с указателями и будет использовать их для
работы с массивами, будьте внимательны при сложении и вычитании
указателей. Например:
int *intp;
intp += sizeof(int);
не будет работать так, как вы задумали (предполагая увеличить
intp для ссылки на следующий элемент массива). Фактически, intp
продвигается на два элемента массива. При сложении или при вычи-
тании из указателя Си принимает во внимание размер элемента, на
который ссылается указатель, поэтому все, что нужно сделать для
продвижения указателя на следующий элемент массива - это опера-
ция:
intp++
Не забывайте о расширении по знаку
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Будьте аккуратны при присваивании целых чисел различного
|
adfun.ru
|
|
|
|