Вы смотрите на первый элемент
лается Parm. Вы смотрите на первый элемент списка, и его строко-
вые данные уже повреждены. Если вы нажмете клавишу Esc, стрелку
вниз, а затем снова клавишу Enter, то вы откроете окно Inspector
(Проверка) для второго узла (элемента) списка. Нажмите клавишу
Enter, чтобы проверить строковые данные. Они не запорчены, факти-
чески, на тот же узел ссылается указатель Tail. Очевидно, что-то
не так с концом строковых данных.
Следите за окном Watch, когда вы используете клавишу F7 для
выполнения цикла. На строке 199 содержится вызов процедуры
GetMem, перед этим вызовом Tail^.Parm^ равно первому символу. Не-
посредственно после вызова GetMem последний символ в Tail^.Parm^
уничтожается.
Что происходит? Для каждого параметра командной строки в
цикле for сначала выделяется запись, затем строковые данные, за-
тем следующая запись и т.д. При вызове GetMem на строке 198 долж-
но выделяться достаточно памяти для строки, плюс байта длины, но,
как можно заметить, к Length(s) не прибавляется 1. Хотя на строке
199 строка успешно копируется, для нее на самом деле выделено на
1 байт меньше, чем она использует. Таким образом, первый символ
строки перекрывается первым байтом следующей записи, выделенной
при обращении к процедуре New(Temp). Последний параметр остается
незапорченным, так как на ним не следует другая ParmRec.
Это все известные нам ошибки в программе. Возможно при ее
выполнении вы найдете какие-то еще. Вы можете исправить эти ошиб-
ки, а затем перекомпилировать программу (для удобства они отмеча-
ются двумя звездочками (**)), или запустить TPDEMO.EXE - версию
программу, о которой рассказывалось в Главе 3 и в которой ошибок
нет.
TDeb 3.0 #2-3 = 162 =
Глава 15. Виртуальная отладка с использованием процессора 80386