Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Почему два куски кода дают различные результаты на 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
14-1086933878
Rouse_
2004-06-11 10:04
2004.06.27
С Днем Рождения 11 июня


14-1086453755
ЫШО
2004-06-05 20:42
2004.06.27
Модуль


14-1086609110
ikivio
2004-06-07 15:51
2004.06.27
LOL


3-1085992981
ORMADA
2004-05-31 12:43
2004.06.27
Перенос полей из одного TQuery в другой


11-1076153158
Ал
2004-02-07 14:25
2004.06.27
Не могу загрузить Bitmap из ресурса