|
Вопрос # 4 995/ вопрос открыт / |
|
Здравствуйте, эксперты!
помогите перевести код с Си на Делфи
DWORD H = 0;int i = 0;int S = 1;
for (i = lstrlen(Stroka)-1; i!= -1; i-)
{
H = (H+Stroka[i]*S) % 65535;
S*=4;
}
return H == 0? 65535: H;
где Stroka-произвольная строка символов.
 |
Вопрос задал: Пупкин В В (статус: 2-ой класс)
Вопрос отправлен: 2 февраля 2011, 15:58
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Пупкин В В!
подозреваю, что в строке for есть ошибка, там не i-, а i--, иначе цикл будет выполнятся бесконечно.\
Код где то такой
var h:dword;
i:integer;
s:integer;
begin
h := 0; s := 1;
for i = length(stroka) downto 1 do begin
h := (h + ord(stroka[i])*s) mod 65535;
s := s * 4;
end;
if h = 0 then result := 65535
else result := h;
end;
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 2 февраля 2011, 16:05
Оценка за ответ: 5
Комментарий к оценке: спасибо за оперативность
|
Ответ #2. Отвечает эксперт: min@y™
На вскидку (дословный перевод), вот так:
function UndefinedFuncName(Stroka: PChar): DWORD;
var
H: DWORD;
i, S: Integer;
begin
S:= 1;
H:= 0;
for i:= StrLen(Stroka) - 1 downto 0 do
begin
H:= (H + Byte(Stroka[i]) * S) mod $FFFF;
S:= S * 4;
end;
if H = 0
then Result:= $FFFF
else Result:= H;
end;
Ахтунг! Код не проверял, возможны ошибки и неточности!
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 2 февраля 2011, 16:10
Оценка за ответ: 5
Комментарий к оценке: спасибо за оперативность
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 2 февраля 2011, 16:36; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 2 февраля 2011, 16:20 [#1]:
to min@y™: и конечно же сделал одну ошибку
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 февраля 2011, 16:20 [#2]:
Ну что, Василий Васильевич, оперативно мы ответили?
Вопросы по коду есть?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 2 февраля 2011, 16:22 [#3]:
Цитата (Вадим К):
и конечно же сделал одну ошибку
Ты прав. Прога без отладки - это полуфабрикат.
Но код я поправил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 2 февраля 2011, 16:27 [#4]:
какой код верный то?
интересуют строки
for i = length(stroka) downto 1 do begin у Вадим К
for i:= StrLen(Stroka) - 1 downto 0 do у min@y
|
|
Вадим К (статус: Академик), 2 февраля 2011, 16:32 [#5]:
теперь оба. просто тип переменной stroka не известен. я предположил, что это string, а minay™ - что это pchar.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 февраля 2011, 16:36 [#6]:
Сишный код предполагает, что это именно указатель (char*). Я именно от этого и плясал. Типа, что заказывали, то и получили.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|