Delphi 7 что за хрень?
От: Figaro Россия  
Дата: 17.03.12 13:51
Оценка:
Доброго времени суток.
Давно не писал около 10 лет на дельфи. Попался код:

Procedure Update(var AStr: String);
var
   i: Integer;
   i64: Int64;
   j: Integer;
   ch: Char;
begin
 for i := 1 to Length(AStr) do begin
     i64 := i;
     for j := 0 to Length(AStr) do begin
         if j <> i then
            i64 := i64 + ord(AStr[j]) * j;
         while i64 > Length(AStr) do
               i64 := i64 - Length(AStr);
     end;
     j := i64;
     ch := AStr[j];
     AStr[j] := AStr[i];
     AStr[i] := ch;
 end;


Теперь несколько вопросов:
1. Что эта хрень делает?
2. Как понимать ord(AStr[j]) при нулевом j.
3. Основное: как это будет выглядеть на C++?
avalon 1.0rc3 build 428, zlib 1.2.5
Re: Delphi 7 что за хрень?
От: acDev Россия  
Дата: 17.03.12 14:52
Оценка: 2 (1)
Здравствуйте, Figaro, Вы писали:

F>Теперь несколько вопросов:

F>1. Что эта хрень делает?
Преобразует строку. Какая то забавная символьная обфускация)))

F>2. Как понимать ord(AStr[j]) при нулевом j.

Это ошибка. Но ord(AStr[0]) возвратит всегда 0, т.к. в предшествующих 4 байтах не бывает огромных чисел.

F>3. Основное: как это будет выглядеть на C++?

Видимо так:
void Update(PCHAR AStr)
{
  INT      i, j, Len;
  __int64  i64;
  CHAR     ch;  
  Len = lstrlenA(AStr); 
  for (i=1; i<=Len; i++) {
    i64 = i;
    for(j=1; j<=Len; j++) {
      if (j<>i) i64 += (INT)AStr[j-1] * j;
      while (i64 >= Len) {
        i64 -= Len; 
      } 
    }
    j = i64;
    ch = AStr[j-1];
    AStr[j-1] = AStr[i-1];
    AStr[i-1] = ch;    
  }
}

Хотя, вроде, цикл while можно заменить на взятие модуля от Len.
Re[2]: Delphi 7 что за хрень?
От: Figaro Россия  
Дата: 17.03.12 14:57
Оценка:
Greate thnxСейчас попробую потестировать...
avalon 1.0rc3 build 428, zlib 1.2.5
Re: Delphi 7 что за хрень?
От: david_yusupov Россия  
Дата: 17.03.12 15:19
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Доброго времени суток.

F>Давно не писал около 10 лет на дельфи. Попался код:

F>
F>Procedure Update(var AStr: String);
F>var
F>   i: Integer;
F>   i64: Int64;
F>   j: Integer;
F>   ch: Char;
F>begin
F> for i := 1 to Length(AStr) do begin
F>     i64 := i;
F>     for j := 0 to Length(AStr) do begin
F>         if j <> i then
F>            i64 := i64 + ord(AStr[j]) * j;
F>         while i64 > Length(AStr) do
F>               i64 := i64 - Length(AStr);
F>     end;
F>     j := i64;
F>     ch := AStr[j];
F>     AStr[j] := AStr[i];
F>     AStr[i] := ch;
F> end;
F>


F>Теперь несколько вопросов:

F>1. Что эта хрень делает?
F>2. Как понимать ord(AStr[j]) при нулевом j.
F>3. Основное: как это будет выглядеть на C++?

в delphi 7 String — массив из char, и индекс начинается с 1, а не с 0 и до Length(AStr)
Re[2]: Delphi 7 что за хрень?
От: Figaro Россия  
Дата: 17.03.12 15:28
Оценка:
d> в delphi 7 String — массив из char, и индекс начинается с 1, а не с 0 и до Length(AStr)

я это знаю, поэтому и удивился ord(AStr[0])
avalon 1.0rc3 build 428, zlib 1.2.5
Re: Delphi 7 что за хрень?
От: Figaro Россия  
Дата: 18.03.12 13:02
Оценка:
И в догонку знатокам Delphi:

if x and (1 shl (7-i)) = 1 shl (7-i) then //x=6, i [0...7]


Не могу понять на что это проверка.
avalon 1.0rc3 build 428, zlib 1.2.5
Re[2]: Delphi 7 что за хрень?
От: Figaro Россия  
Дата: 18.03.12 15:57
Оценка:
Здравствуйте, Figaro, Вы писали:

F> И в догонку знатокам Delphi:


F>
F> if x and (1 shl (7-i)) = 1 shl (7-i) then //x=6, i [0...7]
F>


F> Не могу понять на что это проверка.


Всем спасибо... посмотрел приоритеты операций...
avalon 1.0rc3 build 428, zlib 1.2.5
Re: Delphi 7 что за хрень?
От: Softwarer http://softwarer.ru
Дата: 20.03.12 07:17
Оценка:
Здравствуйте, Figaro, Вы писали:

F>2. Как понимать ord(AStr[j]) при нулевом j.


В первую очередь стоит понять, там ShortString или AnsiString. В первом случае это будет байт длины строки, во втором, как уже сказали — практически наверняка ноль.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.