Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Массивы   Найти похожие ветки 

 
alec_sey   (2006-05-30 02:35) [0]

Люди добоые подскажите почему возникает ошибка и как её исправить
С фиксированным массивом всё нормально а с динамическим почему то
ошибка и именно внутри другого цикла(ниже ошибка помечена)
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   MaskEdit1: TMaskEdit;
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   MaskEdit2: TMaskEdit;
   Button2: TButton;
   Button3: TButton;
   MaskEdit3: TMaskEdit;
   Label2: TLabel;
   Label1: TLabel;
   Label3: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
   f1,f2:file;
    b:array of integer;
   fr,b1:array of integer;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do begin
if not execute then exit else
 MaskEdit1.Text:=OpenDialog1.FileName;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with SaveDialog1 do begin
if not execute then exit else
 MaskEdit2.Text:=SaveDialog1.FileName;
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
s:string;
j,x:integer;
begin
s:=MaskEdit3.Text;
SetLength(b,Length(s));
SetLength(b1,Length(s));
SetLength(fr,Length(s));

for j:=1 to Length(s) do
fr[j-1]:=strtoint(s[j]);

AssignFile(f1,MaskEdit1.Text);
AssignFile(f2,MaskEdit2.Text);
 reset(f1);
 Rewrite(f2);
while not Eof(f1) do
begin
BlockRead(f1,b,1);
for x:=1 to Length(s) do
b1[x-1]:=b[x-1] xor fr[x-1];// здесь ошибка
BlockWrite(f2,b1,1);
Label3.Caption:="Çàøèôðîâàí&#2 37;î "+IntToStr(FileSize(f2))+" áàéò";
Application.ProcessMessages;
end;
end;

end.


 
Rial ©   (2006-05-30 02:51) [1]

fr[j-1]:=strtoint(s[j]);
Так ведь s[j] - это символ. Странная операция, хотя при наличии
хорошей погоды все будет нормально.

Мне не очень понятно, что происходит в программе.
Точнее понятно, что происходит, а вот что хотелось тебе - нет.
Опиши задачу, ее явно можно проще решить.

А главная ошибка вот:

BlockRead(f1,b,1);
и
BlockWrite(f2,b1,1);

b и b1 - это лишь указатели на динамически распределенную память.
Ты их изменяешь, и в результате указатели указывают черт знает куда ...

К тому же, SizeOf(Integer)=4, почему из файла читается по одному байту?
Надо объявить не Array of Integer,а Array of Byte;
Что, собственно, почти и есть строка ...

И читать надо хотябы так(читаем сразу весь массив):
N:=BlockRead(f1,Pointer(b)^,SizeOf(Byte)*Length(b));

BlockWrite(f1,Pointer(b1)^,SizeOf(Byte)*Length(b1));

N возвратит кол-во реально прочитанных байт.
Его и проверишь.

А по секрету говоря, Array of - это зло :)).


 
alec_sey   (2006-05-30 03:01) [2]

s[j] это числа так что ничё тут такого нету, А вообше нужно считать блок
затем каждый I-й елемент блока xorom сопоставить с введённым I-м елементом числовой строки и записть его



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.04 c
2-1148983839
Andrey_Gor
2006-05-30 14:10
2006.06.18
проблема с модулем sharemem!


2-1148196813
Belorus
2006-05-21 11:33
2006.06.18
Список процедур в библиотеке


2-1149084200
Тимофеич
2006-05-31 18:03
2006.06.18
форма


1-1145037989
Wog
2006-04-14 22:06
2006.06.18
Кнопка произвольной формы


3-1145527323
samalex
2006-04-20 14:02
2006.06.18
Выделить целую часть десятичного числа