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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 17:07   #1
ChEaTeR-abc
Заблокирован
 
Регистрация: 30.06.2010
Сообщений: 104
Вопрос range check error

Вот программа:
Код:
unit Unit5;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, ComCtrls;


type
  TForm1 = class(TForm)
    Edit1: TMaskEdit;
    Edit2: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    SaveDialog1: TSaveDialog;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    OpenDialog1: TOpenDialog;
    Button2: TButton;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  Pass,Pass2,Key,Key2,Key3,Pass3:string;
  I:Integer;
  F:TextFile;
  P:array of string;
  K:array of string;


const
  StartKey	= 981;  	{Start default key}
  MultKey	  = 12674;	{Mult default key}
  AddKey	  = 35891;	{Add default key}


function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;

implementation

{$R *.dfm}

{$R-}

{$Q-}


function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
  I : Integer;
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
    StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
  end;
end;


function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
  I : Integer;
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
    StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
  end;
end;
{$R+}
{$Q+}


procedure TForm1.Button1Click(Sender: TObject);
begin
  IF (Edit1.Text<>'') AND (Edit1.Text<>' ') AND (Edit2.Text<>'') AND (Edit2.Text<>' ') THEN
  begin
Randomize;
  Pass:=Edit1.Text;
  Key:=Edit2.Text;
  Pass2:=Encrypt(Pass, StartKey, MultKey, AddKey);
  Key2:=Encrypt(Key, StartKey, MultKey, AddKey);
    try
      Memo1.Lines.LoadFromFile('Ïàðîëè.txt');
      Memo1.Lines.Add(Pass2);
      Memo1.Lines.Add(Key2);
      Memo1.Lines.SaveToFile('Ïàðîëè.txt');
      Memo1.Text:='';
    except
      CloseFile(F);
    end;
      ShowMessage('Ваш пароль:"'+Pass+'".Ключевое слово:"'+Key+);
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('Пароли.txt');
I:=1;
  repeat
    begin
      K[I]:=Decrypt(Memo1.Lines[I], StartKey, MultKey, AddKey);  - Здесь у меня выдает ошибку
      P[I-1]:=Decrypt(Memo1.Lines[I-1], StartKey, MultKey, AddKey);
        I:=I+2;
    end;
  until K[I]=Edit3.Text;
    Key2:=Edit3.Text;
      IF (K[1]=Key2) THEN
        begin
          ShowMessage('Ваш пароль:"'+P[I]+'".Ваш ключ:"'+K[I]+'"');
          Memo1.Lines[0]:='Ваш пароль:"'+Pass3+'"';
          Memo1.Lines[1]:='Ваш ключ:"'+Key3+'"';
        end;
end;

end.
При выполнении выдает ошибку range check error.Гдето на форуме говорили что это изза директив {$R-} и {$R+}(я даже не понимаю что они означают .Функции копировал с сайта).Если их убрать выдает другую ошибку.Помогите исправить программу
ChEaTeR-abc вне форума Ответить с цитированием
Старый 05.07.2010, 23:57   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

{$R+} - директива компилятора, включает проверку выхода значений за допустимые границы диапазона. Директива {$R-} соответственно выключает эту проверку. Директива является локальной (по моему это так называется ), т. е. действует на код расположенный между {$R+} и {$R-}.
Теперь, что касается массива K:
K - у вас объявлен глобальный динамический массив (K: array of string)!!!
Прежде чем использовать динамический массив необходимо прописать процедуру SetLength(K,n), где K - имя массива, n - длина массива. При этом необходимо помнить, что индексация динамических массивов начинается с 0. Тоже самое касается и массива P.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 06.07.2010, 09:34   #3
ChEaTeR-abc
Заблокирован
 
Регистрация: 30.06.2010
Сообщений: 104
По умолчанию

То есть нужно указать длину массива?Это ведь можно сделать ещё при объявлении массива? K:array [0..50] of string - так например?

Добавлено:
Пытался использовать SetLength, но т.к. я ламер-самоучка понятия не имею как использовать эту процедуру .У меня выдает ошибку Incompatible types.Напишите, пожалуйста, как использовать эту процедуру в коде моей программы.
И ещё раз добавлено:вот как я пытался написать:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
SetLength(K,51);
SetLength(P,51);
Memo1.Lines.LoadFromFile('Пароли.txt');
I:=1;
  repeat
    begin
      K[I]:=Decrypt(Memo1.Lines[I], StartKey, MultKey, AddKey);
      P[I-1]:=Decrypt(Memo1.Lines[I-1], StartKey, MultKey, AddKey);
        I:=I+2;
    end;
  until (K[I]=Edit3.Text);
    Key2:=Edit3.Text;
      IF (K[1]=Key2) THEN
        begin
          ShowMessage('Ваш пароль:"'+P[I]+'".Ваш ключ:"'+K[I]+'"');
          Memo1.Lines[0]:='Ваш пароль:"'+Pass3+'"';
          Memo1.Lines[1]:='Ваш ключ:"'+Key3+'"';
        end;
end;

Последний раз редактировалось ChEaTeR-abc; 06.07.2010 в 14:10.
ChEaTeR-abc вне форума Ответить с цитированием
Старый 06.07.2010, 21:33   #4
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Если вы знаете, что вам достаточно 51 элемента в массиве K, то можете объявить его статическим: в разделе var вместо K: array of string пишите
K: array [0..50] of string. Тоже самое можно сделать с массивом P.
Процедура SetLength у вас написана вроде правильно. Проверьте внимательно, может у вас в место буквы g написана q!!! А еще лучше прописать эти процедуры в обработчике OnCreate формы. Т. е. при создании вашей формы будут созданы динамические массивы.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 06.07.2010, 22:48   #5
ChEaTeR-abc
Заблокирован
 
Регистрация: 30.06.2010
Сообщений: 104
По умолчанию

Уже пробовал создавать статические массивы.Та же ошибка.А директивы R- и R+ нужно использовать?

ЗЫ.На сайте с которого я качал функции для шифровки/расшифровки текст были ещё директивы Q+ и Q-.Что они делают и могло ли это както повлиять на появление ошибки?
ChEaTeR-abc вне форума Ответить с цитированием
Старый 06.07.2010, 23:10   #6
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

походу файл с паролями не грузиться и мемо пустой
Sergey2 вне форума Ответить с цитированием
Старый 07.07.2010, 00:48   #7
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

{$Q+} - контроль переполнения при выполнении над целыми операций +, -, *, Abs, Succ, Pred. Все эти дериктивы позволяют избежать ошибок, которые могут возникнуть в процессе работы приложения. Так что их лучше использовать.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 07.07.2010, 05:00   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)а если условие until не выполнится? тогда вылет за рамки массива(данная ошибка)
2)у вас в мемо точно есть две строки?ибо присвоение строк не добавляет их, а только может изменить существующую(данная ошибка)

ЗЫ: 3)
Цитата:
Сначала был бит, потом байт, и только потом в него записали переменную строкового типа - слово
слово это двойной байт вообще то(два байта, тип word)
двойное слово - 4 байта(тип LongWord).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.07.2010, 10:13   #9
ChEaTeR-abc
Заблокирован
 
Регистрация: 30.06.2010
Сообщений: 104
По умолчанию

Цитата:
ЗЫ: 3)
Цитата:
Сначала был бит, потом байт, и только потом в него записали переменную строкового типа - слово
слово это двойной байт вообще то(два байта, тип word)
двойное слово - 4 байта(тип LongWord).
Ну если слово сначало было не одно, то и байтов может быть несколько
ЗЫ.Господа, мы эретеки.Так издеватся над Библией...

1)Проверял в дебаге - until выполняется
2)Вот с количеством строк в Мемо я не понял.Я ведь загружаю файл в него с помощью LoadFromFile.Насколько мне известно, в таком случае будет создаватся столько строк, сколько необходимо чтобы разместить файл.Или я ошибаюсь?

Цитата:
походу файл с паролями не грузиться и мемо пустой
В Мемо выводится файл.Здесь всё нормально.
ChEaTeR-abc вне форума Ответить с цитированием
Старый 07.07.2010, 13:05   #10
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Компонентом текстового файла является строка. Соответственно при его выводе в Memo будет столько же строк сколько и в файле. Но это только в том случае если свойство wordwrap у Memo установлено в false. В противном случае строки будут переноститься (если строка не помещается в Memo) и тогда кличество строк в Memo будет отличаться от количества строк в файле.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Runtime Error '1004': Range of Object '_Global' Failed panuta Microsoft Office Excel 6 17.05.2010 17:04
Range check error MAcK Общие вопросы Delphi 2 24.03.2010 10:33
Check box ruavia3 Microsoft Office Excel 6 17.11.2009 13:31
Использование CHECK Golovastik SQL, базы данных 3 11.11.2009 20:27
ReDim и Subscript out of range (Error 9) oldfatham Microsoft Office Excel 5 24.08.2009 18:32