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
