Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.05.2013, 12:51
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
Сообщение Проверка кода на ошибки после перевода с дурого языка

Предлагаю вашему вниманию такой тип темы.
В чём смысл.
Имеется некий код, написанный на определённом языке.
Имеется необходимость реализовать тот же самый код, но на языке делфи.

Данная тема служит для уточнения правильности и точности перевода кода.

Последний раз редактировалось seeman_tm, 14.05.2013 в 13:01.
Ответить с цитированием
  #2  
Старый 14.05.2013, 12:53
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Кто-нить позовите Кэпа?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 14.05.2013, 12:58
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Имеется код, написанный на языке ActionScript, таково вида:
Код:
        internal static function createBlocksFromString(arg1:String):Array
        {
            var loc1:*=new Array();
            var loc2:*=arg1.length * 8;
            var loc3:*=255;
            var loc4:*=0;
            while (loc4 < loc2) 
            {
                loc1[loc4 >> 5] = loc1[loc4 >> 5] | (arg1.charCodeAt(loc4 / 8) & loc3) << 24 - loc4 % 32;
                loc4 = loc4 + 8;
            }
            loc1[loc2 >> 5] = loc1[loc2 >> 5] | 128 << 24 - loc2 % 32;
            loc1[(loc2 + 64 >> 9 << 4) + 15] = loc2;
            return loc1;
        }

        public static var digest:flash.utils.ByteArray;

Этой функции я придал следующий вид:

Код:
 
 Type ArrayOfInteger = Array Of Integer;

function createBlocksFromString(arg1:String):ArrayOfInteger;
    var loc1 :ArrayOfInteger;
    var loc2 : Integer;
    var loc3: Integer;
    var loc4: Integer;
        Begin
//            loc1:*=new Array();
            loc2 := LenGth(arg1) * 8;
            SetLenGth(loc1,loc2);
            loc3 :=255;
            loc4 :=0;
            while (loc4 < loc2) do
              Begin
                loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)]) And loc3) shl 24 - loc4 mod 32;
                loc4 := loc4 + 8;
              End;
            loc1[loc2 shr 5] := loc1[loc2 shr 5] or 128 shl 24 - loc2 mod 32;
            loc1[(loc2 + 64 shr 9 shl 4) + 15] := loc2;
            Result := loc1;
        End;

Код рабочий и ошибок не выдаёт, но загвоздка в следующем.
Будут ли результаты функции полностью идентичны в первом и втором случае ?
Имеются ли здесь ошибки ?
Ответить с цитированием
  #4  
Старый 14.05.2013, 13:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Счастье

используй отладчики
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 14.05.2013, 13:19
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от NumLock
используй отладчики
При чём тут он ? Функция работает и возвращает данные. Ошибок или исключений нету.
Ответить с цитированием
  #6  
Старый 14.05.2013, 13:20
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

для начала не
Код:
Round(loc4 / 8)
а
Код:
loc4 div 8
или даже
Код:
loc4 shr 3

и расставить скобки в сложных выражениях, и побольше , поскольку приоритеты операций в Delphi могут отличаться от ActionScript. Например в 21 строке - точно нужны.
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
seeman_tm (14.05.2013)
  #7  
Старый 14.05.2013, 14:00
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

icWasya, разницы не увидел, но выглядит лучше. Так что возьму в обиход.
Так же нашел неточность в переводе.
ActionScript:
Код:
 loc1[loc4 >> 5] = loc1[loc4 >> 5] | (arg1.charCodeAt(loc4 / 8) & loc3) << 24 - loc4 % 32;

Было в делфи:
Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)]) And loc3) shl 24 - loc4 mod 32;

Но так как у переменных типа String в Delphi первый символ имеет индекс 1 (массивы начинаются с 0 для первого элемента).
А в переменных типа String в ActionScript, первый символ имеет индекс 0 как и просто массивы.

Поэтому:
Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)+1]) And loc3) shl 24 - loc4 mod 32;
Ну или так:
Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[(loc4 div 8)+1]) And loc3) shl 24 - loc4 mod 32;

Кто нить ещё увидел ошибку ?
Ответить с цитированием
  #8  
Старый 16.05.2013, 12:27
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Нет возможности обкатать функцию в ActionScript и посмотерть на её результаты в этом языке.
Поэтому, пока что обкатываю в JavaScript. Надеюсь у них приоритеты операций идентичны.
А по сему, функция и выражения в ней для делфи получили следующий вид:
Код:
 Type ArrayOfInteger = Array Of Integer;

  function createBlocksFromString(arg1:String):ArrayOfInteger;
    var loc1 :ArrayOfInteger;
    var loc2 : Integer;
    var loc3: Integer;
    var loc4: Integer;
        Begin
//            loc1:*=new Array();
            loc2 := LenGth(arg1) * 8;
            SetLenGth(loc1,(((loc2 + 64) shr 9) shl 4) + 15);
            loc3 :=255;
            loc4 :=0;
            while (loc4 < loc2) do
              Begin
                loc1[loc4 shr 5] := (loc1[loc4 shr 5]) or (byte(arg1[(loc4 div 8)+1]) and loc3) shl ((24 - loc4) mod 32);
                loc4 := loc4 + 8;
              End;
            loc1[loc2 shr 5] := loc1[loc2 shr 5] or (128 shl ((24 - loc2) mod 32));
            loc1[(((loc2 + 64) shr 9) shl 4) + 15] := loc2;
            Result := loc1;
        End;

to icWasya, ещё раз благодарю за наводку про скобки и разноправие операций в виражениях.

Последний раз редактировалось seeman_tm, 16.05.2013 в 12:30.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter