Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенос кода из Java в Delphi, Пара вопросов 
:(
    Опции темы
CynicRus
Дата 21.8.2013, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



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

И так, есть цикл:
Код

do {
                        targetLength += (in[sourceIndex] & 0x7f) << (i++ * 7);
                } while ((in[sourceIndex++] & 0x80) == 0x80);


Я знаю, что do.. while = repeat .. until. Но, что что в в этом цикле происходит, как и условие выхода из него - я пока не смог представить в Delphi.(in - массив байтов)

Затем имеется оператор Switch:

Код

 switch(in[sourceIndex] & 3) {
                        case 0:
                                l = (in[sourceIndex++] >> 2) & 0x3f;
                                switch(l) {
                                case 60:
                                        l = in[sourceIndex++] & 0xff;
                                        l++;
                                        break;
                                case 61:
                                        l = in[sourceIndex++] & 0xff;
                                        l |= (in[sourceIndex++] & 0xff) << 8;
                                        l++;
                                        break;
                        case 1:
                                l = 4 + ((in[sourceIndex] >> 2) & 7);
                                o = (in[sourceIndex++] & 0xe0) << 3;
                                o |= in[sourceIndex++] & 0xff;
                        *****



Как я пока не силюсь, я не могу подобрать адекватные Delphi эквиваленты для представленного кода. Буду очень признателен за помощь, или за адекватный гайд по переносу Java выражений. 

Это сообщение отредактировал(а) Poseidon - 21.8.2013, 11:48
PM MAIL   Вверх
Akella
Дата 21.8.2013, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Код

Case sourceIndex of
0: begin
    l = (in[sourceIndex++] >> 2) & 0x3f;
    case l of
      60: begin l = in[sourceIndex++] & 0xff; l++; end;
      61: begin l = in[sourceIndex++] & 0xff; l |= (in[sourceIndex++] & 0xff) << 8; l++; end;
    end;//case
  end;// 0

1: begin
      l = 4 + ((in[sourceIndex] >> 2) & 7);
      l |= (in[sourceIndex++] & 0xff) << 8;
      l++;
  end;// 1

2: begin


end;


end;//case


Добавлено через 2 минуты и 41 секунду
targetLength += (in[sourceIndex] & 0x7f) << (i++ * 7);

+= это 
targetLength := targetLength + (in[sourceIndex] & 0x7f) << (i++ * 7);

Добавлено через 3 минуты и 27 секунд
++ в Delphi это Inc()
т.е. l++ это Inc(l)

Добавлено через 4 минуты и 4 секунды
Полностью эту (in[sourceIndex++] & 0xff) запись я разобрать не могу

Добавлено через 4 минуты и 41 секунду
& - это в delphi, наверное OR - или просто +, т.е. операция (логического) сложения
PM MAIL   Вверх
Poseidon
Дата 21.8.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(CynicRus @  21.8.2013,  10:38 Найти цитируемый пост)
Я знаю, что do.. while = repeat .. until.
 do.. while в Java, это скорее while..do в Delphi.

Цитата(CynicRus @  21.8.2013,  10:38 Найти цитируемый пост)
Затем имеется оператор Switch:
Switch, по-моему, обычный case в Delphi.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
CynicRus
Дата 21.8.2013, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Цитата(Poseidon @ 21.8.2013,  11:58)
Цитата(CynicRus @  21.8.2013,  10:38 Найти цитируемый пост)
Я знаю, что do.. while = repeat .. until.
 do.. while в Java, это скорее while..do в Delphi.

Цитата(CynicRus @  21.8.2013,  10:38 Найти цитируемый пост)
Затем имеется оператор Switch:
Switch, по-моему, обычный case в Delphi.

Относительно операторов то проблем не возникает, проблема у меня именно с условиями, явовской математикой. 

Как распарсить запись вида: (in[sourceIndex] & 0x7f) << (i++ * 7);, << это ведь поидее оператор присвоения. Но чему он тут присваивается? 

Или же что означает o |= in[sourceIndex++] & 0xff; , & по идее - логическое и. Но в попытке охватить этот, у меня без опыта в Java - мозг падает в segfault:)

А do while, это всё же repeat until, посколько repeat прогоняет код 1 раз в любом случае, a while do вроде сначала условие проверяет, а потом уже код выполняет.

Это сообщение отредактировал(а) CynicRus - 21.8.2013, 12:20
PM MAIL   Вверх
MetalFan
Дата 21.8.2013, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(CynicRus @  21.8.2013,  12:18 Найти цитируемый пост)
<< это ведь поидее оператор присвоения

это сдвиг влево, т.е. shl в делфи

"|=" - это побитовое сложение, т.е. operator := operator OR....
типа +=, математическое сложение

Код

do {
                        targetLength += (in[sourceIndex] & 0x7f) << (i++ * 7);
                } while ((in[sourceIndex++] & 0x80) == 0x80);

примерно так:
Код

function incPP(var AVal: integer): integer;
begin
  result := AVal;
  inc(AVal);
end;
...
  repeat
     targetLength := targetLength + (in[sourceIndex] and $7f) shl (incPP(i) *7);
   until (in[incPP(sourceIndex)] and $80) <> $80))


Добавлено @ 15:44
Код

 switch(in[sourceIndex] & 3) {
                        case 0:
                                l = (in[sourceIndex++] >> 2) & 0x3f;
                                switch(l) {
                                case 60:
                                        l = in[sourceIndex++] & 0xff;
                                        l++;
                                        break;
                                case 61:
                                        l = in[sourceIndex++] & 0xff;
                                        l |= (in[sourceIndex++] & 0xff) << 8;
                                        l++;
                                        break;
                        case 1:
                                l = 4 + ((in[sourceIndex] >> 2) & 7);
                                o = (in[sourceIndex++] & 0xe0) << 3;
                                o |= in[sourceIndex++] & 0xff;
                        *****


Я бы перевел как-то так:
Код

   case (in[sourceIndex] and $3) of
     0: begin
        l := (in[incPP(sourceIndex)] shr 2) and $3f;
       case l of
         60: begin
               l := in[incPP(sourceIndex)] and $ff;
              inc(l);
         
         end;
         61: begin
            l := in[incPP(sourceIndex)]& $ff;
            l := l or (in[incPP(sourceIndex)]) and $ff;
            inc(l);
         end;
       end;
     1: begin
        l := 4 + (in[sourceIndex] shr 2) and 7;
        o := (in[incPP(sourceIndex)] and $xe0) shl 3;
        o := o OR in[incPP(sourceIndex)] and $ff
     end;
     end;
  end;


на истину не претендую, думаю, что может даже не скомпилится... но направление понятно, я думаю)

Это сообщение отредактировал(а) MetalFan - 21.8.2013, 15:47


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
CynicRus
Дата 22.8.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Спасибо! И вот ещё 1 маленький вопросик в дополнение к первому:

как переписать выражение :

Код

c = L > o ? o : L;


насколько я понял это примерно тоже самое что:

Код

if (l > 0) then
    c:=0 
  else
     c:=l;


но я не до конца уверен-)



Это сообщение отредактировал(а) CynicRus - 22.8.2013, 10:31
PM MAIL   Вверх
MetalFan
Дата 22.8.2013, 10:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



CynicRus, да, можно короче:
Код

uses Math;
...
  c:= ifthen( L > o, o, l);



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
CynicRus
Дата 22.8.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.