Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.041 c
4-1084913143
GanibalLector
2004-05-19 00:45
2004.06.27
прием WM_USER в консоли.


3-1086065729
ligor
2004-06-01 08:55
2004.06.27
Помогите с запросом


3-1086241896
Litr
2004-06-03 09:51
2004.06.27
Поиск по дате


6-1083752795
cherrex
2004-05-05 14:26
2004.06.27
SNIFFER сети


3-1085853107
Yakudza
2004-05-29 21:51
2004.06.27
ADOCommand





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский