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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 02:21   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Exception class EInOutError with message 'I/O error 6'

Написала программу эмулирующую работу виртуальной машины
Код:
program virtual_machine;

{APPTYPE CONSOLE}

uses
  SysUtils;
//==============================================================================
//    описание типов данных и переменных
//==============================================================================
const
  count_char_ident=100;
  table_size=100;
  memory_size=100;
  cmd_stop=-1;
  cmd_add=-2;
  cmd_sub=-3;
  cmd_mul=-4;
  cmd_del=-5;
  cmd_neg=-6;
  cmd_load=-7;
  cmd_save=-8;
  cmd_dub=-9;
  cmd_clr=-10;
  cmd_swap=-11;
  cmd_up=-12;
  cmd_goto=-13;
  cmd_ifeq=-14;
  cmd_ifne=-15;
  cmd_le=-16;
  cmd_lt=-17;
  cmd_ge=-18;
  cmd_gt=-19;
  cmd_in=-21;
  cmd_out=-22;
  cmd_or=-23;
  cmd_and=-24;
  cmd_not=-25;

type ident=record
  name_ident:string[count_char_ident];
  value:integer;
end;

var
  memory:array[0..memory_size-1] of integer;
  pc:integer;
  sp:integer;
  cmd:integer;
  buf:integer;
  in_file,out_file:text;
  ch:char;
  t_table_ident:array [0..table_size] of ident;
  count_table:integer;

procedure next_ch;  //получение следующего символа
begin
  if (eof(in_file)) then ch:=chr(0)
  else if (eoln(in_file)) then
  begin
    readln(in_file);
    ch:=chr(10);
  end
  else
  begin
    read(in_file,ch);
  end;
end;


function number:integer;  //сохранение числа
var
  chislo:integer;
begin
  chislo:=ord(ch)-48;
  next_ch;
  while (ch in ['0'..'9']) do
  begin
      chislo:=chislo*10+(ord(ch)-48);
      next_ch;
  end;
  number:=chislo;
end;


function funct:integer; //опредедение функции
var
  str:string;
  f:integer;
  i:integer;
begin
//==============================================================================
//    накопление
//==============================================================================
  str:=ch;
  next_ch;
  while((ch in ['a'..'z']) or (ch in ['0'..'9'])) do
  begin
    str:=str+ch;
    next_ch;
  end;
//==============================================================================
//    определение
//==============================================================================
  if(str='stop') then
  begin
    f:=cmd_stop;
  end
  else if(str='add') then
  begin
    f:=cmd_add;
  end
  else if(str='sub') then
  begin
    f:=cmd_sub;
  end
  else if(str='mul') then
  begin
    f:=cmd_mul;
  end
  else if(str='del') then
  begin
    f:=cmd_del;
  end
  else if(str='neg') then
  begin
    f:=cmd_neg;
  end
  else if(str='load') then
  begin
    f:=cmd_load;
  end
  else if(str='save') then
  begin
    f:=cmd_save;
  end
  else if(str='dub') then
  begin
    f:=cmd_dub;
  end
  else if(str='clr') then
  begin
    f:=cmd_clr;
  end
  else if(str='swap') then
  begin
    f:=cmd_swap;
  end
  else if(str='up') then
  begin
    f:=cmd_up;
  end
  else if(str='goto') then
  begin
    f:=cmd_goto;
  end
  else if(str='ifeq') then
  begin
    f:=cmd_ifeq;
  end
  else if(str='ifne') then
  begin
    f:=cmd_ifne;
  end
  else if(str='le') then
  begin
    f:=cmd_le;
  end
  else if(str='lt') then
  begin
    f:=cmd_lt;
  end
  else if(str='ge') then
  begin
    f:=cmd_ge;
  end
  else if(str='gt') then
  begin
    f:=cmd_gt;
  end
  else if(str='in') then
  begin
    f:=cmd_in;
  end
  else if(str='out') then
  begin
    f:=cmd_out;
  end
  else if(str='or') then
  begin
    f:=cmd_or;
  end
  else if(str='and') then
  begin
    f:=cmd_and;
  end
  else if(str='not') then
  begin
    f:=cmd_not;
  end
  else
//==============================================================================
//    если идетифиатор
//==============================================================================
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 02:22   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
  begin
    i:=0;
    while((i<count_table)and(t_table_ident[i].name_ident<>str))do
      inc(i);
    if((i<count_table)and(t_table_ident[i].name_ident=str))then
    begin
      memory[sp]:=i;
      dec(sp);
    end
    else
    begin
      t_table_ident[count_table].name_ident:=str;
      t_table_ident[count_table].value:=0;
      memory[sp]:=count_table;
      dec(sp);
      inc(count_table);
    end;
    f:=cmd_load;
  end;
 funct:=f;
end;

//==============================================================================
//    главная программа
//==============================================================================
begin
//==============================================================================
//    инициализация данных
//==============================================================================
  pc:=0;
  sp:=memory_size-1;
  cmd:=memory[pc];
  count_table:=0;
  assign(in_file,'input.txt');
  reset(in_file);
//==============================================================================
//    запись данных в массив
//==============================================================================
  next_ch;
  while (ch<>chr(0)) do
  begin
    while(ch<>chr(10))and (ch<>chr(0)) do
    begin
      if (ch in ['1'..'9']) then
      begin
        memory[sp]:=number;
        sp:=sp-1;
      end
      else if(ch in ['a'..'z']) then
      begin
        memory[pc]:=funct;
        inc(pc)
      end
      else if (ch=' ') then next_ch;
    end;
    next_ch;
  end;
  close(in_file);
  memory[pc]:=cmd_stop;
//==============================================================================
//    основная работа
//==============================================================================
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 02:22   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
  pc:=0;
  sp:=memory_size-1;
  cmd:=memory[pc];
  while (cmd<>cmd_stop) do
  begin
    inc(pc);
    if cmd>=0 then
    begin
      dec(sp);
      memory[sp]:=cmd;
    end
    else
      case cmd of
          cmd_add:
          begin
            dec(sp);
            memory[sp]:=memory[sp]+memory[sp+1];
          end;
          cmd_sub:
          begin
            dec(sp);
            memory[sp]:=memory[sp+1]-memory[sp];
          end;
          cmd_del:
          begin
            dec(sp);
            memory[sp]:=memory[sp+1] div memory[sp];
          end;
          cmd_mul:
          begin
            dec(sp);
            memory[sp]:=memory[sp+1]*memory[sp];
          end;
          cmd_neg:
          begin
            memory[sp]:=-memory[sp];
          end;
          cmd_save:
          begin
            t_table_ident[memory[sp+1]].value:=memory[sp];
            sp:=sp-2;
          end;
          cmd_dub:
          begin
            sp:=sp+1;
            memory[sp]:=memory[sp-1];
          end;
          cmd_clr:
          begin
            sp:=sp-1;
          end;
          cmd_swap:
          begin
            buf:=memory[sp];
            memory[sp]:=memory[sp-1];
            memory[sp-1]:=buf;
          end;
          cmd_up:
          begin
            inc(sp);
            memory[sp]:=memory[sp-2];
          end;
          cmd_goto:
          begin
            pc:=memory[sp];
            sp:=sp-1;
          end;
          cmd_ifeq:
          begin
            if(memory[sp-2]=memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_ifne:
          begin
            if(memory[sp-2]<>memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_le:
          begin
            if(memory[sp-2]<=memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_lt:
          begin
            if(memory[sp-2]<memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_ge:
          begin
            if(memory[sp-2]>=memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_gt:
          begin
            if(memory[sp-2]>memory[sp-1]) then pc:=memory[sp];
            sp:=sp-3;
          end;
          cmd_in:
          begin
            read(t_table_ident[memory[sp]].value);
          end;
          cmd_out:
          begin
            writeln(t_table_ident[memory[sp]].value);
          end;
          cmd_or:
          begin
            dec(sp);
	          if((memory[sp]=0) and (memory[sp+1]=0)) then memory[sp]:=0
	          else memory[sp]:=1;
          end;
          cmd_and:
          begin
            dec(sp);
	          if((memory[sp]<>0) and (memory[sp+1]<>0)) then  memory[sp]:=1
	          else memory[sp]:=0;
          end;
          cmd_load:
          begin
             memory[sp]:=t_table_ident[memory[sp]].value;
          end;
          cmd_not:
          begin
            if(memory[sp]=0) then memory[sp]:=1
            else memory[sp]:=0;
          end
          else
          begin
            writeln('недопустимый код операции');
            memory[pc]:=cmd_stop;
          end;
      end;
      cmd:=memory[pc];
  end;
  readln;
end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 02:23   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

но она вывыливается в Exception class EInOutError with message 'I/O error 6' на последней строке и там где я пытаюсь читать из консоли
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 02:34   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Надеюсь это поможет:
Цитата:
date/time : 2010-12-17, 01:28:39, 609ms
processors : 2x AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
physical memory : 1140/2047 MB (free/total)
free disk space : (C 2,90 GB (E 24,03 GB
display mode : 1280x1024, 32 bit
process id : $cec
allocated memory : 5,12 MB
executable : VM.exe
exec. date/time : 2010-12-17 01:28
compiled with : Delphi 7
callstack crc : $f5ade5dd, $f5ade5dd, $f5ade5dd
exception number : 1
exception class : EInOutError
exception message : File not found.

;Call Stack
main thread ($cf4):
0045fa22 +52 VM.exe virtual_machine 247 +13 initialization //Ошибка в строке 247


disassembling:
0045f9d0 public virtual_machine.initialization: ; function entry point
0045f9d0 234 push ebp
0045f9d1 mov ebp, esp
0045f9d3 add esp, -$10
0045f9d6 push ebx
0045f9d7 push esi
0045f9d8 push edi
0045f9d9 mov eax, [$464b00]
0045f9de mov byte ptr [eax], 1
0045f9e1 mov eax, $45f8a8
0045f9e6 call -$590e3 ($406908) ; SysInit.@InitExe
0045f9eb mov ebx, $466d98
0045f9f0 mov edi, $466bc8
0045f9f5 238 xor esi, esi
0045f9f7 239 mov dword ptr [edi], $63
0045f9fd 241 xor eax, eax
0045f9ff mov [$469838], eax
0045fa04 242 mov edx, $460310 ; 'input.txt'
0045fa09 mov eax, $466bcc
0045fa0e call -$5cca3 ($402d70) ; System.@Assign
0045fa13 243 mov eax, $466bcc
0045fa18 call -$5cf1d ($402b00) ; System.@ResetText
0045fa1d call -$5d1e6 ($40283c) ; System.@_IOTest
0045fa22 247 > call -$7bf ($45f268) ; virtual_machine.next_ch ; знак > - место ошибки. Строка 247 в исходном коде.
0045fa27 248 cmp byte ptr [ebx], 0
0045fa2a jz loc_45faa2
0045fa2c jmp loc_45fa8e
0045fa2e 252 mov al, [ebx]
0045fa30 add al, $cf
0045fa32 sub al, 9
0045fa34 jnb loc_45fa5a
0045fa36 254 call -$773 ($45f2c8) ; virtual_machine.number
0045fa3b mov edx, [edi]
0045fa3d cmp edx, $63
0045fa40 jbe loc_45fa47
0045fa42 call -$5c1e3 ($403864) ; System.@BoundErr
0045fa47 mov [edx*4+$466a38], eax
0045fa4e 255 sub dword ptr [edi], 1
0045fa51 jno loc_45fa58
0045fa53 call -$5c1ec ($40386c) ; System.@IntOver
0045fa58 jmp loc_45fa8e
0045fa5a 257 mov al, [ebx]
0045fa5c add al, $9f
0045fa5e sub al, $1a
[...]
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2010, 02:48   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

не совсем поняла, как можно исправить ошибку?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 02:51   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

FileNotFound - говорит прямо. Того чего надо у нас нет.

зато есть это:
Код:
  assign(in_file,'input.txt');
а он создаётся?
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2010, 02:55   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

есть он,прога из него даже данные читает. ошибка не там, ошибка в последне части проги где делается read с консоли
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 03:39   #9
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

но я не поняла как исправить ее
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.12.2010, 13:24   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Не слушайте человека борща, он тупит

http://www.delphifaq.com/faq/delphi/...ide/f153.shtml

I/O Error 6 - это Invalid file handle. Это означает, что ввод консоли не открыт.

Достаточно странная вещь, надо сказать. Если вы уверены, что у вас именно консольное приложение (writeln нормально работает?) и вы уверены, что запускаете его нормально (без перенаправления ввода?), то лучше бы вам выложить рабочий пример для демонстрации.

Как вариант - вставьте перед вызовом readln вызов writeln (например, writeln("Ready"). Будет работать или нет? Уже информация.

Кроме этого можно попробовать вставить readln в начало программы, после AssignFile/Reset и в середину - кто из них будет работать?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка raized exception class EListError with message 'List index out of bounds(1)'.Process stopped SGRaptor Софт 0 22.05.2010 19:12
Project Project1.exe raised exception class EnvalidOP Rock'n'rolla Безопасность, Шифрование 16 20.01.2010 18:39
"Project Project1.exe raised class EConvertError with message'''is not a valid floating point value'." Doz1metr Помощь студентам 9 24.06.2009 19:06
Ошибка:"Project raised exception class EConvertError..." Gambit90 Помощь студентам 6 14.01.2009 14:12
raised exception class EIdSocketError with message' Socket Error # 10022 Invalid argument eldar Работа с сетью в Delphi 16 08.08.2008 23:49