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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2011, 20:09   #1
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
Печаль ошибка при выполнении програмы Access Violotaion at add reoss 00404704 in moule Project1.exe

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Edit2: TEdit;
    Edit4: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    procedure Edi1KeyPress(Sender: TObject; var Key: Char);
    procedure Edi2KeyPress(Sender: TObject; var Key: Char);
    procedure Edi3KeyPress(Sender: TObject; var Key: Char);
    procedure Edi4KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

uses Unit2;

{$R *.dfm} {$n+} {$E+}

procedure TForm1.Edi1KeyPress(Sender: TObject; var Key: Char);

begin

  if not(key in['а'..'я','А'..'Я',#8]) then
  key:=#0;
end;

procedure TForm1.Edi2KeyPress(Sender: TObject; var Key: Char);

begin

  if not(key in['а'..'я','А'..'Я',#8]) then
  key:=#0;
end;

procedure TForm1.Edi3KeyPress(Sender: TObject; var Key: Char);

begin

  if not(key in['а'..'я','А'..'Я',#8]) then
  key:=#0;
end;

procedure TForm1.Edi4KeyPress(Sender: TObject; var Key: Char);

begin

  if not(key in['а'..'я','А'..'Я',#8]) then
  key:=#0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s,
s1,
s2,
s3:string;
q,
dp,
d,
kl1,
kl2,
kl3:array[1..5] of integer ;
g:string;
k,
p,
j,
ind,
z,
io,
i:byte;
f1,
f2,
f3:byte;
sn,
sh:array of string;
begin
 g:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
 f1:=0;
 f2:=0;
 f3:=0;
 S:=form1.Edit1.Text;
 S1:=form1.Edit2.Text;
 S2:=form1.Edit3.Text;
 S3:=form1.Edit4.Text;
if (s1=s2) or (s2=s3) or (s3=s1) then
 begin
 showmessage('ключи не должны совпадать');
 form1.Edit2.Text:='';
 form1.Edit3.Text:='';
 form1.Edit4.Text:='';
 end
 else
  if length(s1)<>5 then
   begin
    showmessage('ключ должен состаять из 5 символов')  ;
    form1.Edit2.Text:=''   ;
   end
  else
    if length(s2)<>5 then
     begin
     showmessage('ключ должен состаять из 5 символов') ;
     form1.Edit3.Text:='';
     end
    else
      if length(s3)<>5 then
       begin
        showmessage('ключ должен состаять из 5 символов') ;
        form1.Edit4.Text:='' ;
       end
      else
        if (length(s)>25) or (length(s)<20) then
         begin
          showmessage('исходный текст долженн быть от 20 до 25 символов');
          form1.Edit1.Text:=''
         end;
for j:=1 to 5 do
 for i:=1 to 5 do

  if s1[i]=s1[j] then
   begin
    if i<>j then
     f1:=1;
   end;
for j:=1 to 5 do
 for i:=1 to 5 do
  if s1[i]=s1[j] then
   begin
    if i<>j then
     f2:=1;
   end;
for j:=1 to 5 do
 for i:=1 to 5 do
  if s1[i]=s1[j] then
   begin
    if i<>j then
    f3:=1;
   end;

if f1=1 then
 begin
  showmessage('');
  form1.Edit2.Text:='символы в ключе не должны повторяться,ключ1';
 end
 else
  if f2=1 then
   begin
    showmessage('символы в ключе не должны повторяться,ключ2');
    form1.Edit3.Text:='';
   end
   else
    if f3=1 then
     begin
     showmessage('символы в ключе не должны повторяться,ключ3');
      form1.Edit4.Text:='';
     end;
if form1.Edit1.Text='' then
 ShowMessage('текст для шифрации не в веден')
else
 if form1.Edit2.Text='' then
  ShowMessage('ключ 1 не в веден')
 else
 if form1.Edit3.Text='' then
  ShowMessage('ключ 2 не в веден')
 else
  if form1.Edit4.Text='' then
   ShowMessage('ключ 4 не в ведне')
    else
    begin

   for j:=1 to 5 do
      for i:=1 to 36 do
       if s1[j]=g[i] then kl1[j]:=i ;
     for i:=1 to 5 do
      dp[i]:=q[i];
     for i:=1 to 5 do
      begin
       p:=dp[i];
       j:=1;
        while p>dp[j] do
         j:=j+1;
       for k:=i-1 downto j do
        dp[k+1]:=dp[k];
        dp[j]:=p;
      end;

     for j:=1 to 5 do
      for I:=1 to 5 do
       if dp[j]=q[i] then kl1[i]:=j;


   
    for j:=1 to 5 do
      for i:=1 to 36 do
       if s2[j]=g[i] then kl2[j]:=i ;
     for i:=1 to 5 do
      dp[i]:=q[i];
     for i:=1 to 5 do
      begin
       p:=dp[i];
       j:=1;
        while p>dp[j] do
         j:=j+1;
       for k:=i-1 downto j do
        dp[k+1]:=dp[k];
        dp[j]:=p;
      end;

     for j:=1 to 5 do
      for I:=1 to 5 do
       if dp[j]=q[i] then kl2[i]:=j;



   ind:=0;
   io:=0;
   J:=1;
  for i:=1 to 5 do
   ind:=ind+1;
   io:=io+1;
   sh[j,io]:=s[i];
    if (ind mod 5) = 0 then
     begin
      j:=j+1;
      io:=1;
     end;

  for i:=1 to 5 do
   for j:=1 to 5 do
    sn[i,j]:=sh[i,kl1[j]];

  for i:=1 to 5 do
   for j:=1 to 5 do
    sh[i,j]:=sn[kl2[i],j];



    end;
end;




end.

не могу понять в чем ошибка(
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Stilet; 13.02.2011 в 11:37.
Dvoishnik вне форума Ответить с цитированием
Старый 12.02.2011, 21:32   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В этой помойке мало кто может что либо понять.
Но формально, если откомпилировать код, ошибки при работе программы не возникает (D7). Когда и при каких условиях возникает ошибка.

P.S. Рекомендую уважать тех к кому обращаетесь и исправлять не читаемый текст после копирования его в пост.
Прик вне форума Ответить с цитированием
Старый 12.02.2011, 21:56   #3
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

прошу прошения за не исправленый текст

ошибка возникает при выполнении процедуры
procedure TForm1.Button1Click(Sender: TObject);

скорей всего гдето здесь
Код:
begin

for j:=1 to 5 do
 for i:=1 to 36 do
  if s1[j]=g[i] then kl1[j]:=i ;
for i:=1 to 5 do
 dp[i]:=q[i];
for i:=1 to 5 do
 begin
  p:=dp[i];
  j:=1;
 while p>dp[j] do
  j:=j+1;
 for k:=i-1 downto j do
  dp[k+1]:=dp[k];
  dp[j]:=p;
 end;

for j:=1 to 5 do
 for I:=1 to 5 do
 if dp[j]=q[i] then kl1[i]:=j;



for j:=1 to 5 do
 for i:=1 to 36 do
  if s2[j]=g[i] then kl2[j]:=i ;
for i:=1 to 5 do
 dp[i]:=q[i];
for i:=1 to 5 do
 begin
  p:=dp[i];
  j:=1;
 while p>dp[j] do
  j:=j+1;
 for k:=i-1 downto j do
  dp[k+1]:=dp[k];
  dp[j]:=p;
 end;

for j:=1 to 5 do
for I:=1 to 5 do
if dp[j]=q[i] then kl2[i]:=j;



ind:=0;
io:=0;
J:=1;
for i:=1 to 5 do
ind:=ind+1;
io:=io+1;
sh[j,io]:=s[i];
if (ind mod 5) = 0 then
begin
j:=j+1;
io:=1;
end;

for i:=1 to 5 do
for j:=1 to 5 do
sn[i,j]:=sh[i,kl1[j]];

for i:=1 to 5 do
for j:=1 to 5 do
sh[i,j]:=sn[kl2[i],j];

end;
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Stilet; 13.02.2011 в 11:39.
Dvoishnik вне форума Ответить с цитированием
Старый 12.02.2011, 22:03   #4
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

и програма писана на Delphi 6
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 12.02.2011, 22:33   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ну, хорошо. Какие символы должны быть в едитах?
Надо же воспроизвести ситуацию.
Прик вне форума Ответить с цитированием
Старый 12.02.2011, 22:41   #6
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

к примеру
ключ 1
осень
ключ 2
Весна
ключ 3
якорь

я пошол гулять встретил друга
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 12.02.2011, 23:23   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ошибка возникает на строке
Код:
  sh[j,io]:=s[i];
естественным образом.
Все элементы динамического массива (sh:array of string;) должны быть размещены в памяти, прежде чем к ним обращаться (иначе это просто указатель на начало массива, в котором отсутствуют элементы).
Обращение к несуществующему элементу (sh[j,io]; кстати, откуда двойной индекс для одномерного массива?) приводит к AV.

Лекарство: смотреть в сторону SetLength или в объявлении массива указать нужное количество элементов, если это количество заранее известно (статический массив: sh:array[0..X] of string;).
Прик вне форума Ответить с цитированием
Старый 12.02.2011, 23:28   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> откуда двойной индекс для одномерного массива?

первый — индекс строки в массиве, второй — индекс символа в строке.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.02.2011, 23:47   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Спасибо за подсказку, veniside. Здесь речь не об этом. И вопрос был к автору.
Прик вне форума Ответить с цитированием
Старый 12.02.2011, 23:52   #10
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

исправил обявление масива на
Код:
 sh:array[1..5,1..5] of string;
ошибка осталась поменялся номер с 00404704 на 00407А0
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выполнении 123cmp Помощь студентам 4 22.01.2011 23:45
Access violation при выполнении Bernarditto C++ Builder 5 04.11.2010 14:25
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25
Access violation at address при выполнении end elsin Общие вопросы Delphi 5 30.01.2009 10:29
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13