Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

FAQ: Моя программа сбора данных и управления устройством заработала! - Значит ли это, что я всё правильно сделал?

На самом деле предостаточно вариантов неправильного или некорректного программирования изделия, при котором оно заработает.

После естественной и по-человечески понятной радости, связанной с достижением видимого результата, настоятельно рекомендуем сверить Ваш исходный код с примерами программирования Л Кард и с Руководством программиста! Поскольку есть опасность того, что Вы не вызвали, не в той последовательности или неправильно вызвали функции инициализации или управления устройством, вследствие чего нужные переменные были неявно инициализированы или приняли зависимое от сторонних факторов значение. Подобная ошибка может иметь серьёзные последствия: изделие с Вашим ПО может уже эксплуатироваться, а после обновления ПО, перекомпиляции, а также при работе с другим экземпляром оборудования может сказаться ранее допущенная ошибка.

Кроме того, очень часто первые попытки "завести" программу делают начерно, не тратя времени на аккуратное программирование: например, не обрабатывают ошибки и нештатные ситуации, не проверяют корректность данных, а прежде всего – рассматривают только частный случай (жестко задают параметры числовыми константами и т.п.).

Такой подход называется "по месту" или "ad hoc" ("к этому" - лат.) и вполне оправдан, если Вы пишете программу для собственных нужд на короткое время (например, используете прибор в эксперименте для дипломного проекта, а Ваша спеицальность – не программирование). В этом случае качество программы не главное, лишь бы оно не влияло на корректность результатов. Но если, к примеру, Вы решите использовать эту программу снова через год, причем в нее потребуется вносить изменения или запускать на другом компьютере, могут начаться удивительные вещи.

Пример почти из жизни: осваивая программирование модуля АЦП, программист использовал для задания количества каналов число 4. Массив для кадра описал как double adc_data[4], а при обработке во всех циклах "for (i = 0; i < 4; i++)". Потом чуть меняется задача, и он решает обобщить код, вынеся количество каналов в параметр функции и заменив константу на переменную:
for (i = 0; i < num_chan; i++) { ...adc_data[i]... }
Но забывает про размер массива, и тот остается 4.
В результате происходит затирание памяти с непредсказуемым результатом, причем ошибка может не проявиться сразу в первом прогоне, а потом приводить к такому поведению программы, что первая реакция автора – "этого не может быть". На поиск такой ошибки может уйти куча времени.

Итак, если Ваша программа пишется не на один раз и будет использоваться не только автором, то мы рекомендуем отделять "учебные" программы от "рабочих", причем последние не переделывать из первых, а писать заново, с нуля, перепроверяя себя. Хорошая практика – тестировать только что написанный код, пока он свеж в памяти: если какой-то участок программы можно протестировать сразу, не дописывая всю программу, то лучше так и поступить.

Читайте также следующие статьи раздела FAQ:

 

Перейти к другим статьям FAQ       Cтатья создана:09.08.2014
Последняя редакция:04.11.2020

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск