Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2011, 13:03   #1
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
Вопрос Процессор NTVDM обнаружил недопустимую инструкцию (глючит Паскаль?)

Запускаю программу. Через несколько секунд программа Паскаль молча закрывается.
Откладка программы. (читайте дальше комментарий в коде)

Код:
USES CRT;
CONST disk='F:\';
var
filik:text;
fileAll,fileAll2:text;
i:longint;
i2:String;
PROCEDURE Copy;
begin
     Assign(fileAll,disk+'BAZA\All.txt');
     Rewrite(fileAll);
     Writeln('Копирование...');
     for i:=1 to 33 do
         begin
              Str(i,i2);
              Assign(filik,disk+'BAZA\'+i2+'.txt');
              Reset(filik);
              while NOT EOF(filik) do
                    begin
                         Readln(filik,i2);
                         Writeln(fileAll,i2);
                    end; {while}
              Close(filik);
              end;
end; {PROCEDURE}
PROCEDURE Pustostrochnyj_otbor;
var
PS_pisat:Boolean;
i_pust:array[0..128] of ^String;
begin
     Assign(fileAll,disk+'BAZA\All.txt');
       Reset(fileAll);
     Assign(fileAll2,disk+'BAZA\All2.txt');
       Rewrite(fileAll2);
     Writeln('Пустострочный отбор...');
       i_pust[0]^:='';
       for i:=1 to 128 do
           i_pust[i]^:=i_pust[i-1]^+' '; {создаем пустые строки}
{******************************}
{Когда i=42 Паскаль вылетает с ошибкой (см. вниз)}
     while NOT EOF(fileAll) do
           begin
                PS_pisat:=true;
                Readln(fileAll,i2);
                for i:=1 to 128 do
                    if i2=i_pust[i]^ then PS_pisat:=false;
                if PS_pisat=true then Writeln(fileAll2,i2);
{если строка не пуста, записать в файл}
           end; {while}
     Close(fileAll); Close(fileAll2);
     while KeyPressed do ReadKey;
end; {PROCEDURE}
PROCEDURE Dlinnovoj_otbor;
begin
     Assign(fileAll,disk+'BAZA\All2.txt');
       Reset(fileAll);
     Assign(fileAll3,disk+'BAZA\All3.txt');
       Rewrite(fileAll3);
     Writeln('Длинновой отбор...');
     while NOT EOF(fileAll) do
           begin
                Readln(fileAll,i2);
                if Length(i2)>=6 then Writeln(fileAll3,i2);
           end; {while}
     Close(fileAll); Close(fileAll3);
     while KeyPressed do ReadKey;
end; {PROCEDURE}
begin
     TextBackground(Black); TextColor(LightGray);
     ClrScr;
     Copy; {копируем содержимое файлов в один}
     Pustostrochnyj_otbor; {отбираем строки содержащие только пробелы или вообще пустые}
     Dlinnovoj_Otbor; {отбор строк по длине}
{     Dublikatsionnyj_otbor;}
     while KeyPressed do ReadKey;
     for i:=1 to 2 do Writeln;
     Writeln('Выполнено.');
     Writeln;
     Writeln('Результаты копирования находятся в файле All.txt');
     Writeln('Результаты копирования находятся и пустострочного отбора в файле All2.txt');
     Writeln('Результаты копирования находятся,  пустострочного и длиннового отборов в файле All3.txt');
     ReadKey;
end.
Что это? Компилятор разучился компилировать или что?
Изображения
Тип файла: jpg Процессор NTVDM.jpg (87.4 Кб, 64 просмотров)
hon вне форума Ответить с цитированием
Старый 02.08.2011, 13:33   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Компилятор разучился компилировать или что?

с компилятором всё в порядке, а вот с указателями у вас проблемы.

Код:
i_pust[0]^:='';
при этом i_pust[0] указывает в никуда. Имхо, простого New() будет достаточно:

Код:
for i:= 0 to 128 do
  New(i_pust[i]);
или, если хочется экономии на спичках, можно GetMem() использовать.

Вобще, код немного странный. Для того, чтобы проверить, что строка не состоит из 1..128 пробелов, совсем не обязательно хранить массив из 128 строк, состоящих и 1..128 пробелов.

Цитата:
{если строка не пуста, записать в файл}
при этом дейтсвительно пустые строки вида '' у вас таки будут записаны в файл.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 02.08.2011 в 13:42.
veniside вне форума Ответить с цитированием
Старый 02.08.2011, 13:41   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

В процедуре Copy FileAll не закрыт.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глючит паскаль DRAgon™ Софт 23 07.11.2010 01:50
Ошибка NTVDM Д'якон Безопасность, Шифрование 1 07.06.2010 01:19
Может вы знаете что делать если 'процессор NTVDM обнаружил недопустимую инструкцию' aslanbek999 Помощь студентам 1 04.06.2009 00:26
Ошибка: Процессор NTVDM обнаружил недопустимою инструкцию. Iceman Паскаль, Turbo Pascal, PascalABC.NET 4 23.03.2009 14:32