Рассмотрим C код из OpenCV Tutorial 8 - Chapter 9Переводя локальную статическую переменную в C в Common Lisp
// Learn the background statistics for one more frame
void accumulateBackground(IplImage *I){
static int first = 1;
cvCvtScale(I, Iscratch, 1, 0);
if(!first){
cvAcc(Iscratch, IavgF);
cvAbsDiff(Iscratch, IprevF, Iscratch2);
cvAcc(Iscratch2, IdiffF);
Icount += 1.0;
}
first = 0;
cvCopy(Iscratch, IprevF);
}
Кажется, как код предназначен, что из-за
if(!first)
программа никогда не будет выполнять:
cvAcc(Iscratch, IavgF);
cvAbsDiff(Iscratch, IprevF, Iscratch2);
cvAcc(Iscratch2, IdiffF);
Icount += 1.0;
В Lisp Я пытаюсь перевести это как:
(defun accumulate-background (i)
(setf 1st 1)
(cvt-scale i i-scratch-1 1 0) ;; To float
(if (not 1st)
(progn (acc i-scratch-1 i-avg-f)
(abs-diff i-scratch-1 i-prev-f i-scratch-2)
(acc i-scratch-2 i-diff-f)
(setf i-count (+ i-count 1.0))))
(setf 1st 0)
(copy i-scratch-1 i-prev-f))
Для эквивалентной функции, с (not 1st)
для !first
, и я думаю, что это правильно. В C++ я:
static int first = 1;
if(first){
cout << "reached this part of code " << endl << " " << first << endl << endl;
}
но никогда не производит никакой продукции из-за дизайна кода, кажется. Почему дизайнеру учебного кода нравится это? Он копирует из Изучает OpenCV.
Нет, '(setf first nil)' не может быть перемещен в блок 'except', потому что блок' except' никогда не будет выполнен. Кроме того, «это только нужно выполнить один раз» не является хорошей причиной для перемещения чего-либо в блок 'except', потому что этот блок предназначен для выполнения каждого вызова, кроме одного. –
@ Rörd Да, я все испортил! Я попытался сохранить слишком много от первого примера, который я дал. Я удалил последний неправильный код и параграф. –
@ Joshua Taylor спасибо Джошуа Тейлор и все ...... еще за то, что помогли мне с этим .... должен ли я включить свой рабочий код, если я его понял? –