Форум: "Потрепаться";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизПочему два куски кода дают различные результаты на Delphi и c? Найти похожие ветки
← →
miwa © (2004-06-09 10:44) [0]Неа, я понял, что потому что они разные. Но вот в чем разница?
Вот сишный код:
int StartKey = 470;
int MultKey = 6234;
int AddKey = 11719;
int i;
char outstr[32];
char inpstr[32];
...
for(i=0; i<strlen(inpstr); i++)
{
outstr[i] = ((inpstr[i]) ^ (StartKey >> 8));
StartKey = (outstr[i] + StartKey) * MultKey + AddKey;
}
А вот дельфийский:
const
StartKey = 470;
MultKey = 6234;
AddKey = 11719;
var I : Byte;
//result: string; <-- это из объявления функции
Result := Result + Char(word(InString[I]) xor (StartKey shr 8));
StartKey := (word(Result[I]) + StartKey) * MultKey + AddKey;
Естественно, переменные StartKey, MultKey и AddKey в обеих случаях одинаковы, так же как и переменные outstr и Result; а также InString и inpstr - еквивалентны.
Самообразовываюсь, вот...
Думал, что из-за того, что размер интежеров разный; посмотрел доку - нет, одинаковый. Помогите.
← →
miwa © (2004-06-09 10:45) [1]А. Ну конечно, в дельфийском коде тоже есть цикл:
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(word(InString[I]) xor (StartKey shr 8));
StartKey := (word(Result[I]) + StartKey) * MultKey + AddKey;
end;
← →
Rouse_ © (2004-06-09 10:47) [2]I: Integer
← →
Anatoly Podgoretsky © (2004-06-09 10:48) [3]var I : Integer;
← →
Rouse_ © (2004-06-09 10:48) [4]Удалено модератором
Примечание: Не по теме :)
← →
вразлет © (2004-06-09 10:50) [5]miwa ©
Всегда пишешь одну и тот же код на двух языках?) Не доверяешь компиляторам?)
← →
miwa © (2004-06-09 11:01) [6]> [2], [3]:
Тогда объясните, пожалуйста, почему тим данных счетчика имеет столь решающее значение.
> [4]:
:о))
Нет, просто интерессно стало. Говорю же: самообразовываюсь. Вообще-то дельфийский код пренадлежит АП, так что можно было бы доверить даже не компилятору, а автору ;о))
← →
miwa © (2004-06-09 11:47) [7]Блин! Так долго писал и впустую. Ладно, еще раз, а потом - в буфер :о(.
Значить, пробую кодировать строку testtring.
Delphi(d6):#117#97#39#119#220#245#220#108#74#171
C(gnu):#117#97#39#119#-36#83#-45#11#-97#93
Код перевода "коказябров" в ascii:
Delphi:
FOR I:=1 TO Length(S) Do
begin
CurChar :="#"+Inttostr(Ord(S[I]));
Insert (CurChar, RS, X);
X := X + Length(CurChar);
end;
C:
for(i=0;i<strlen(outstr);printf("#%d",outstr[i++]));
Дельфийский код опять не мой :о)).
А самое интерессное: почему начало результатов одинаковое?
← →
KSergey © (2004-06-09 12:09) [8]char в Си - знаковый тип
Ord(S[I]) в дельфи дает беззнаковый результат (во всяком случае для букв в диапазоне 0..255)
Напишите в Cи unsigned char
← →
Anatoly Podgoretsky © (2004-06-09 12:18) [9]miwa © (09.06.04 11:01) [6]
Брать надо с моей страницы, там правильный код, а не где то в Сети, где часто гуляет код и Дельфи 1
← →
Anatoly Podgoretsky © (2004-06-09 12:20) [10]Примечание: byte имеет диапазон от 0 до 255 и если строка будет длиннее 255 символов, то будет серьезная проблема! В Д1 не было AnsiString
← →
Verg © (2004-06-09 12:21) [11]
> word(InString[I])
> word(Result[I])
Почему word? Почему не Integer?
← →
Verg © (2004-06-09 12:24) [12]И вообще, как это такое может быть?
> const
> StartKey = 470;
> .............................
> StartKey := .....
← →
Anatoly Podgoretsky © (2004-06-09 12:30) [13]Должно быть так
StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
word или самодеятельность или опять же взято из кривых источников. Не думаю, что это эквиваленты
StartKey = (outstr[i] + StartKey) * MultKey + AddKey;
StartKey := (word(Result[I]) + StartKey) * MultKey + AddKey;
← →
miwa © (2004-06-09 12:36) [14]Ура! Заработало! Проблема была в различных типах данных:
> Напишите в Cи unsigned char
...
> Почему word? Почему не Integer?
>
> Anatoly Podgoretsky © (09.06.04 12:18) [9]
> miwa © (09.06.04 11:01) [6]
> Брать надо с моей страницы ... а не где-то в Сети,
Нашел на "Единой базе", было подписано вашим именем.
Всем ответившим - большое спасибо.
← →
Anatoly Podgoretsky © (2004-06-09 12:53) [15]Единая база не мой сайт.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.069 c