Доброго времени суток.
Давно не писал около 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++?
Здравствуйте, 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.
Greate thnx

Сейчас попробую потестировать...
Здравствуйте, 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)
d> в delphi 7 String — массив из char, и индекс начинается с 1, а не с 0 и до Length(AStr)
я это знаю, поэтому и удивился ord(AStr[0])
И в догонку знатокам Delphi:
if x and (1 shl (7-i)) = 1 shl (7-i) then //x=6, i [0...7]
Не могу понять на что это проверка.
Здравствуйте, Figaro, Вы писали:
F> И в догонку знатокам Delphi:
F> F> if x and (1 shl (7-i)) = 1 shl (7-i) then //x=6, i [0...7]
F>
F> Не могу понять на что это проверка.
Всем спасибо... посмотрел приоритеты операций...