Попытка создания вложенных циклов, генерирующих ошибку отсутствующих аргументов - PullRequest
0 голосов
/ 03 января 2011

Я пытаюсь научить себя программировать с использованием Tcl. (Я хочу поближе познакомиться с языком, чтобы понять чужой код - шахматы SCID) Задача, которую я поставил перед собой, чтобы мотивировать свое обучение Tcl, - решить проблему 8 ферзей. Мой подход к созданию программы состоит в том, чтобы последовательно «прототипировать» решение. Так. Я до того, чтобы вложить цикл для удержания позиции q в строке 2 внутри цикла for, удерживающего позицию q в строке 1

Вот мой код

set allowd 1
set notallowd 0

for {set r1p 1} {$r1p <= 8} {incr r1p } {
    puts "1st row q placed at $r1p" 
    ;# re-initialize r2 'free for q placemnt' array after every change of r1 q pos:
    for {set i 1 } {$i <= 8} {incr i} { set r2($i) $allowd    }

    for { set r2($r1p) $notallowd ; set r2([eval $r1p-1]) $notallowd ;
           set r2([eval $r1p+1]) $notallowd ; set r2p 1}   {$r2p <= 8} {
         incr r2p ;# end of 'next' arg of r2 forloop
        }
        ;# commnd arg of r2 forloop placed below: 
        {puts "2nd row q placed at $r2p"    
    }
} 

Моя проблема в том, что когда я запускаю код, интерпретатор прерывается с фатальной ошибкой: "неправильный #args должен быть для начала теста следующей команды.

Я просмотрел свой код несколько раз и не вижу, что пропустил ни один из аргументов цикла for.

1 Ответ

5 голосов
/ 04 января 2011

Возврат каретки перед командой в последнем цикле for - это то, что вас заводит.Из первого правила синтаксиса на справочной странице Tcl : "Точки с запятой и символы новой строки являются разделителями команд, если они не указаны в кавычках, как описано ниже".Кстати, ваш eval должен быть expr.

Это работает для меня:

set allowd 1
set notallowd 0

for {set r1p 1} {$r1p <= 8} {incr r1p } {
    puts "1st row q placed at $r1p" 
    ;# re-initialize r2 'free for q placemnt' array after every change of r1 q pos:
    for {set i 1 } {$i <= 8} {incr i} { set r2($i) $allowd    }

    for { set r2($r1p) $notallowd ; set r2([expr $r1p-1]) $notallowd ;
        set r2([expr $r1p+1]) $notallowd ; set r2p 1}   {$r2p <= 8} {
        incr r2p ;# end of 'next' arg of r2 forloop
    } {
        # commnd arg of r2 forloop placed below: 
        puts "2nd row q placed at $r2p"    
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...