Я делаю программку-шифратор, сейчас там один работающий шифр и один в разработке.
Проблема заключается в том, что если использовать генератор ключа без пометки Кастомного шифрования (Выбор шифра --> Особый Шифр --> Создать особый ключ шифрования --> Кастомное шифрование неалфавитных граф. значков), то после перестает работать Шифр Цезаря. А именно символьная часть, символы просто больше не шифруются. Никак не могу понять, с чем это связано, ведь на чекбоксе просто висят переключатели "Vision" эдитов и т.д.
Ссылка на проект (гугл диск):
https://drive.google.com/open?id=1AWeJt ... lRzoWlrwo7
UPD: Lazarus 1.6.4
Прошу помощи, комбинированая проблема
Модератор: Модераторы
-
GrEFeRFeeD
- незнакомец
- Сообщения: 6
- Зарегистрирован: 01.08.2018 14:21:44
Вы правда вручную клали на форму сотню меток и сотню инпутов? Нет, у меня исключительно академический интерес. В первую очередь я советую вам привести код в порядок. Заменить дублирующиеся присваивания, которые при желании и небольшом размышлении можно преобразовать функцию из одной строки (замены символов у вас там например...), заменить рукотворные одинаковые элементы на форме динамическим их созданием в цикле (так будет проще и менять у них визибилити потом), и самое главнео - убрать ВСЕ глобальные переменные в модуле; разобрать их по структурам или классам. Уверен, что ваша проблема в том, что где-то используются одинаковые переменные, которые во втором случае инициализируются так, что первый алгоритм портится.
GrEFeRFeeD
У Вас шифр цезаря и сам по себе не работает.
И если хотите, чтобы Вам помогли - введите в свой код комментарии. Где этот самый шифр цезаря?
У Вас вся проблема в том, что, как верно заметил java73, Вы из своего кода сделали помойку. Приведите код в порядок и сами увидите, где у Вас ошибка.
У Вас шифр цезаря и сам по себе не работает.
И если хотите, чтобы Вам помогли - введите в свой код комментарии. Где этот самый шифр цезаря?
У Вас вся проблема в том, что, как верно заметил java73, Вы из своего кода сделали помойку. Приведите код в порядок и сами увидите, где у Вас ошибка.
-
GrEFeRFeeD
- незнакомец
- Сообщения: 6
- Зарегистрирован: 01.08.2018 14:21:44
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;