Прошу помощи, комбинированая проблема

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прошу помощи, комбинированая проблема

Сообщение GrEFeRFeeD » 01.08.2018 15:37:43

Я делаю программку-шифратор, сейчас там один работающий шифр и один в разработке.
Проблема заключается в том, что если использовать генератор ключа без пометки Кастомного шифрования (Выбор шифра --> Особый Шифр --> Создать особый ключ шифрования --> Кастомное шифрование неалфавитных граф. значков), то после перестает работать Шифр Цезаря. А именно символьная часть, символы просто больше не шифруются. Никак не могу понять, с чем это связано, ведь на чекбоксе просто висят переключатели "Vision" эдитов и т.д.

Ссылка на проект (гугл диск):
https://drive.google.com/open?id=1AWeJt ... lRzoWlrwo7
UPD: Lazarus 1.6.4
GrEFeRFeeD
незнакомец
 
Сообщения: 6
Зарегистрирован: 01.08.2018 15:21:44

Re: Прошу помощи, комбинированая проблема

Сообщение java73 » 03.08.2018 10:38:57

Вы правда вручную клали на форму сотню меток и сотню инпутов? Нет, у меня исключительно академический интерес. В первую очередь я советую вам привести код в порядок. Заменить дублирующиеся присваивания, которые при желании и небольшом размышлении можно преобразовать функцию из одной строки (замены символов у вас там например...), заменить рукотворные одинаковые элементы на форме динамическим их созданием в цикле (так будет проще и менять у них визибилити потом), и самое главнео - убрать ВСЕ глобальные переменные в модуле; разобрать их по структурам или классам. Уверен, что ваша проблема в том, что где-то используются одинаковые переменные, которые во втором случае инициализируются так, что первый алгоритм портится.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Прошу помощи, комбинированая проблема

Сообщение Vadim » 03.08.2018 12:19:26

GrEFeRFeeD
У Вас шифр цезаря и сам по себе не работает.
И если хотите, чтобы Вам помогли - введите в свой код комментарии. Где этот самый шифр цезаря?
У Вас вся проблема в том, что, как верно заметил java73, Вы из своего кода сделали помойку. Приведите код в порядок и сами увидите, где у Вас ошибка.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Прошу помощи, комбинированая проблема

Сообщение GrEFeRFeeD » 03.08.2018 12:20:53

java73 писал(а):Вы правда вручную клали на форму сотню меток и сотню инпутов? Нет, у меня исключительно академический интерес. В первую очередь я советую вам привести код в порядок. Заменить дублирующиеся присваивания, которые при желании и небольшом размышлении можно преобразовать функцию из одной строки (замены символов у вас там например...), заменить рукотворные одинаковые элементы на форме динамическим их созданием в цикле (так будет проще и менять у них визибилити потом), и самое главнео - убрать ВСЕ глобальные переменные в модуле; разобрать их по структурам или классам. Уверен, что ваша проблема в том, что где-то используются одинаковые переменные, которые во втором случае инициализируются так, что первый алгоритм портится.


Можно сказать, что в ручную. Методом копирования и вставки. Я просто не так уж и много о языке знаю, только азы и несколько функций, по этому то и код в таком состоянии.
Что ж, благодарю за совет, попробую это сделать.

Добавлено спустя 2 минуты 35 секунд:
Vadim писал(а):GrEFeRFeeD
У Вас шифр цезаря и сам по себе не работает.
И если хотите, чтобы Вам помогли - введите в свой код комментарии. Где этот самый шифр цезаря?
У Вас вся проблема в том, что, как верно заметил java73, Вы из своего кода сделали помойку. Приведите код в порядок и сами увидите, где у Вас ошибка.


Пока не залезть в генератор ключа и не попереключаться - работает.
Сам код:
Код: Выделить всё
Memo2.Clear;
  m:='';
  k:=0;
  s:='';
  h:='';
  n:=StrToInt(Edit1.Text);
  if RadioGroup1.ItemIndex = 0 then
  begin
  For i:=1 to Memo1.Lines.Count do h:=h+Memo1.Lines[i-1];
  For i:=1 to Length(h) do
   begin
   m:=copy(h,i,1);
    For ii:=1 to 26 do
     begin
     if m=ensm[ii] then
     begin
       k:=ii+n;
        if k>26 then
       While k>26 do k:=k-26;
       s:=s+ensm[k];
       //d:=d+1;
       Break;
     end else
     if m=encp[ii] then
     begin
      k:=ii+n;
        if k>26 then
       While k>26 do k:=k-26;
       s:=s+encp[k];
       //d:=d+1;
       Break;
     end;
    end;
    For ii:=1 to smbi do
     begin
     if m=smbl[ii] then
     begin
       k:=ii+n;
        if k>smbi then
       While k>smbi do k:=k-smbi;
       s:=s+smbl[k];
      //d:=d+1;
       Break;
     end;
     end;
   end;
   Memo2.Lines.Add(s);
  end
  // расшифровка
  else if RadioGroup1.ItemIndex = 1 then
  begin
  For i:=1 to Memo1.Lines.Count do h:=h+Memo1.Lines[i-1];
  For i:=1 to Length(h) do
   begin
   m:=copy(h,i,1);
    For ii:=1 to 26 do
     begin
     if m=ensm[ii] then
     begin
       k:=ii-n;
        if k<1 then
       While k<1 do k:=k+26;
       s:=s+ensm[k];
       //d:=d+1;
       Break;
     end else
     if m=encp[ii] then
     begin
      k:=ii-n;
        if k<1 then
       While k<1 do k:=k+26;
       s:=s+encp[k];
       //d:=d+1;
       Break;
     end;
    end;
    For ii:=1 to smbi do
     begin
     if m=smbl[ii] then
     begin
       k:=ii-n;
        if k<1 then
       While k<1 do k:=k+smbi;
       s:=s+smbl[k];
       //d:=d+1;
       Break;
     end;
     end;
   end;
   Memo2.Lines.Add(s);
  end;
GrEFeRFeeD
незнакомец
 
Сообщения: 6
Зарегистрирован: 01.08.2018 15:21:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 26

Рейтинг@Mail.ru