cpp →
Найди ошибки. Пример 1
Как я понял моя идея с игрой «найди ошибки в коде» получила поддержку. Давайте попробуем. Вот первый пример кода, содержащий некоторое количество 64-битных ошибок. Если понравится этот пост, следующие примеры будут для разнообразия еще содержать параллельные ошибки и ошибки на внимательность.
Итак, рассмотрим программы, содержащие ошибки. Этот код компилируется в 32-битном и 64-битном режиме. В 32-битном он работоспособен, в 64-битном — нет. Вы также можете скачать здесь проект с этим кодом для Visual Studio 2005.
Программа просит пользователя ввести пять чисел в диапазоне от 0 до 100. Если пользователь введет число вне этого диапазона, то программа сообщит об этом: «Некорректное число в позиции N». Затем программа проверяет, вводил ли пользователь цифру '5' при вводе данных. Если это так, то программа выдает соответствующее сообщение:«Был использован символ '5'.».
Текст программы:
Предлагаю силой мысли найти имеющиеся в коде ошибки и описать их. После обсуждения я выложу корректный вариант программы и кратко поясню ошибки, если что-то останется неясным.
P.S.
Хочу попросить обсуждать именно ошибки, а не недостатки программы. Например, понятно, что использовать магическую константу 5 (количество элементов) это не хорошо. Но к ошибкам это не имеет отношения. Также прошу не обсуждать, что программа не имеет смысла, что она неэффективна, что ее можно оптимизировать и сократить. :)
Итак, рассмотрим программы, содержащие ошибки. Этот код компилируется в 32-битном и 64-битном режиме. В 32-битном он работоспособен, в 64-битном — нет. Вы также можете скачать здесь проект с этим кодом для Visual Studio 2005.
Программа просит пользователя ввести пять чисел в диапазоне от 0 до 100. Если пользователь введет число вне этого диапазона, то программа сообщит об этом: «Некорректное число в позиции N». Затем программа проверяет, вводил ли пользователь цифру '5' при вводе данных. Если это так, то программа выдает соответствующее сообщение:«Был использован символ '5'.».
Текст программы:
#include <tchar.h> #include <iostream> #include <string> #include <sstream> using namespace std; struct MyStruct { int m_v; void *m_p; }; int _tmain(int, _TCHAR*) { locale::global(locale("Russian_Russia.1251")); MyStruct *A = NULL; try { cout << "Введите 5 чисел (диапазон 0..100) : "; size_t structSize = sizeof(int) + sizeof(void *); A = (MyStruct *)malloc(structSize * 5); if (A == NULL) return 1; for (size_t i = 0; i != 5; i++) cin >> A[i].m_v; stringstream buf; for (MyStruct *p = A; p <= &A[4]; p++) { if (p->m_v < 0 || p->m_v > 100) throw p - A; buf << p->m_v; } string str = buf.str(); size_t result = str.find("5"); if (result != unsigned(-1)) cout << "Был использован символ '5'." << endl; free(A); } catch (int position) { free(A); cout << "Некорректное число в позиции " << position + 1 << "." << endl; } return 0; }
Предлагаю силой мысли найти имеющиеся в коде ошибки и описать их. После обсуждения я выложу корректный вариант программы и кратко поясню ошибки, если что-то останется неясным.
P.S.
Хочу попросить обсуждать именно ошибки, а не недостатки программы. Например, понятно, что использовать магическую константу 5 (количество элементов) это не хорошо. Но к ошибкам это не имеет отношения. Также прошу не обсуждать, что программа не имеет смысла, что она неэффективна, что ее можно оптимизировать и сократить. :)
26.01.2010 10:49+0300