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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2014, 17:11   #1
vankai14
Пользователь
 
Регистрация: 27.05.2014
Сообщений: 11
Восклицание Ошибка в процедуре

Здравствуйте, при запуске программы. ошибка в процедуре

keyshedule(ikeys,flag, keyhelp, keyresult);

вот часть кода:

Код:
 secret:m9;
 
 const 
 pbox:array[0..63] of byte = (0,16,32,48,1,17,33,49,2,18,34,50,3,19,35,51,
                              4,20,36,52,5,21,37,53,6,22,38,54,7,23,39,55,
                              8,24,40,56,9,25,41,57,10,26,42,58,11,27,43,59,
                              12,28,44,60,13,29,45,61,14,30,46,62,15,31,47,63); 
                                    
 pboxinv:array[0..63] of byte = (0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,
                                 1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,
                                 2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,
                                 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63);
                                 
 sbox:array[0..15] of byte=(12,5,6,11,9,0,10,13,3,14,15,8,4,7,1,2);
     
 sboxinv:array[0..15] of byte=(5,14,15,8,12,1,2,13,11,4,6,3,0,7,9,10);
 
 //ПРОЦЕДУРЫ ГЕНЕРАЦИИ РАУНДОВЫХ ПОДКЛЮЧЕЙ
 procedure keyshedule(subkeynum:byte; keyflag:boolean; sheduling:m9; var resultofsheduling:m9);
    var ish, helpsh:byte;
    begin
    for ish:=0 to 9 do
    resultofsheduling[ish]:=(sheduling[(ish+2) mod 9] mod 32) + (sheduling[(ish+1) mod 9]);
    helpsh:=(resultofsheduling[0] div 16) shr 4;
    if keyflag = true then helpsh := sbox[helpsh]
       else helpsh := sboxinv[helpsh];
    helpsh:=helpsh shl 4;
    resultofsheduling[0] := resultofsheduling[0] mod 16 + helpsh;
    helpsh := (subkeynum shr 4) shl 7;
    resultofsheduling[2]:=resultofsheduling[2] xor helpsh;
    helpsh := subkeynum div 16;
    resultofsheduling[3]:=resultofsheduling[3] xor helpsh;
    end;
 
 procedure generatekeys(flag:boolean; keyforgen:m9; var keyround:mkeys);
   var ikeys,ikeys2, rounds:byte;
   keyhelp, keyresult:array[0..9] of byte;
   begin
   for ikeys:=0 to 9 do keyhelp[ikeys]:=keyforgen[ikeys];
   for ikeys:=1 to 32 do
      begin
      keyshedule(ikeys,flag, keyhelp, keyresult);  //ОШИБКА ТУТ
      for ikeys2:=0 to 7 do keyround[ikeys,ikeys2]:=keyresult[ikeys2];
      end;
   
   end;

Последний раз редактировалось vankai14; 26.06.2014 в 17:13.
vankai14 вне форума Ответить с цитированием
Старый 26.06.2014, 17:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Назначение процедур и ошибка конечно секретные. Штирлиц?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.06.2014, 17:27   #3
vankai14
Пользователь
 
Регистрация: 27.05.2014
Сообщений: 11
По умолчанию

Код:
//ПРОЦЕДУРА S-ЗАМЕНЫ  
 procedure sboxchange(box:m15; inbytes:m7; var outbytes:m7);
   var si:byte;
   begin
   for si:=0 to 15 do
     begin
     outbytes[si] := inbytes[si] div 16;
     outbytes[si] := outbytes[si] shl 4;
     outbytes[si] := box[outbytes[si]];
     outbytes[si] := outbytes[si] shl 4;
     
     inbytes[si] := inbytes[si] mod 16;
     inbytes[si] := box[inbytes[si]];
     outbytes[si] := outbytes[si] + inbytes[si]
     end;
   end;
 //ПРОЦЕДУРА Р-ПЕРЕСТАНОВКИ  
 procedure player(p:m63; indata:m7; var outdata:m7);
   var pcicle, phelpin:byte; 
   begin
     for pcicle := 0 to 63 do
       begin
       phelpin := indata[pcicle div 8];
       phelpin := phelpin shr (7 - (cicle mod 8));
       phelpin := phelpin shl 7;
       phelpin := phelpin shr (p[pcicle] mod 8);
       outdata[p[pcicle] div 8] := outdata[p[pcicle] div 8] + phelpin
       end;
   end;
   
   
 //ПРОЦЕДУРА ШИФРОВАНИЯ
  procedure encrypt(coming:m7; var got:m7);
    var eni,enj:byte;
    begin
      generatekeys(true, key, roundkeys);
      for eni := 1 to 31 do
      begin
       // СЛОЖЕНИЕ ПО МОДУЛЮ 2 С ПОДКЛЮЧОМ
       for enj := 0 to 7 do coming[enj] := coming[enj] xor roundkeys[eni,enj];
       
       sboxchange(sbox, coming, got);
       for enj := 0 to 7 do 
        begin 
        coming[enj] := got[enj];
        got[enj] := 0;
        end;
      
      player(pbox, coming, got);
      for enj := 0 to 7 do 
        begin 
        coming[enj] := got[enj];
        got[enj] := 0;
        end;
      end;
      
    for enj := 0 to 7 do got[enj] := coming[enj] xor roundkeys[32,enj];
    end;
  
 //ПРОЦЕДУРА РАСШИФРОВАНИЯ
  procedure decrypt(deccoming:m7; var decgot1:m7);
   var deci, decj:byte;
   begin
   generatekeys(false, key, decroundkeys);
   for decj :=0 to 7 do deccoming[decj] := deccoming[decj] xor decroundkeys[32, decj];
   
   for deci :=31 downto 1do
     begin
     
     player(pboxinv, deccomig, decgot);
     for decj := 0 to 7 do 
         begin
         deccoming[decj] := decgot[decj];
         decgot[decj] := 0;
         end;
     pboxchange(pboxinv, deccoming, decgot);
     for decj := 0 to 7 do 
         begin
         deccoming[decj] := decgot[decj];
         decgot[decj] := 0;
         end;
     end;
   for deci := 0 to 7 do decgot[deci] := deccoming[deci];
   end;
 
 //ТЕЛО ПРОГРАММЫ
 begin
 
 writeln(' enter OpenText ');
 for i := 0 to 7 do read(blockin[i]);
 
 writeln(' enter key ');
 for i := 0 to 9 do read(secret[i]);
 
 encrypt(blockin, blockout);
 writeln; writeln; writeln;
 write(' ciphered:  ');
 for i := 0 to 7 do write(' ', blockout[i]);
 for i := 0 to 7 do begin blockin[i] := blockout[i]; blockout[i] :=0; end; 
 
 decrypt(blockin, blockout);
  write(' deciphered:  ');
 for i := 0 to 7 do write(' ', blockout[i]);
 for i := 0 to 7 do begin blockin[i] := blockout[i]; blockout[i] :=0; end; 
 
 end.
vankai14 вне форума Ответить с цитированием
Старый 26.06.2014, 17:28   #4
vankai14
Пользователь
 
Регистрация: 27.05.2014
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Назначение процедур и ошибка конечно секретные. Штирлиц?
остальная часть программы. без отладки пока
vankai14 вне форума Ответить с цитированием
Старый 26.06.2014, 17:32   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А текст ошибки? Выход за пределы массива?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.06.2014, 17:53   #6
vankai14
Пользователь
 
Регистрация: 27.05.2014
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А текст ошибки? Выход за пределы массива?
Program1.pas(52) : Нельзя преобразовать тип array [0..9] of byte к array [0..9] of byte
vankai14 вне форума Ответить с цитированием
Старый 26.06.2014, 18:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это надо смотреть код весь, что ты в нее передаешь к примеру и какого оно типа.
Скорее всего ты туда пихаешь не переменку типа m9, а что-то другое. Т.е типы:
t1:array[0..9] of integer
и t2:m9 где m9 = array[0..9] of integer
тогда t1 и t2 - имеют типы разные, и в параметр типа m9 нельзя передать переменку типа t1
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.06.2014, 18:25   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Program1.pas(52) : Нельзя преобразовать тип array [0..9] of byte к array [0..9] of byte
вы описали процедуру:
Цитата:
Код:
procedure keyshedule(subkeynum:byte; keyflag:boolean; sheduling:m9; var resultofsheduling:m9);
а вызваете неверно:
Цитата:
Код:
   keyhelp, keyresult:array[0..9] of byte;
   begin
   for ikeys:=0 to 9 do keyhelp[ikeys]:=keyforgen[ikeys];
   for ikeys:=1 to 32 do
      begin
      keyshedule(ikeys,flag, keyhelp, keyresult);  //ОШИБКА ТУТ
я не знаю, какого типа m9, но попробуйте написать так:
Код:
 
 procedure generatekeys(flag:boolean; keyforgen:m9; var keyround:mkeys);
   var ikeys,ikeys2, rounds:byte;
   keyhelp, keyresult: m9;
   begin
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка в процедуре 3Doleg Паскаль, Turbo Pascal, PascalABC.NET 2 19.11.2012 22:24
ошибка в процедуре C++ Karina89 Помощь студентам 4 24.11.2011 18:25
Ошибка в процедуре Yalovick Паскаль, Turbo Pascal, PascalABC.NET 1 13.05.2011 20:38
Ошибка в процедуре H_U_M_M_E_R Помощь студентам 2 02.06.2010 18:51
Ошибка в процедуре GAGARIN-NEW Помощь студентам 2 21.12.2007 09:23