Ваша проблема в этой строке:
set $max $i
В Tcl символ $
означает чтение из именованной переменной и использование этого значения в качестве (возможно, части) аргументав команду.Это означает, что всегда .Никаких исключений (если, конечно, не указано обратный слеш или {
фигурные скобки }
).Таким образом, на первой итерации цикла вы получаете (после подстановки):
set 1 12
Имя переменной 1
допустимо, но необычно и не то, что вы хотите.Чтобы алгоритм работал, вы вместо этого хотите дать команде set
имя переменной, которую нужно установить, max
, в результате чего:
set max $i
, которая будетзаменил это на первой итерации:
set max 12
Это выглядит правильно!Хорошее практическое правило для будущего программирования заключается в том, что если команда манипулирует переменной (устанавливает ее или обновляет), вам необходимо передать имя переменной, а не значение, полученное из нее.
Стандартный метод получения максимального значения списка состоит из одной строки:
set max [tcl::mathfunc::max {*}$items]
При этом используется встроенная функция max
(которая находится в пространстве имен ::tcl::mathfunc
) и передается содержимое.списка в items
как несколько аргументов, все как один шаг.Последовательность {*}$
представляет собой комбинацию правила синтаксиса чтения переменных с правилом раскрытия списка, о котором вы, вероятно, еще не задумывались.Тем не менее, это хорошее упражнение - написать свой собственный искатель максимума в качестве учебного упражнения.