Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

С# - Delphi


Страницы:   1 2

novichek ©   (2014-03-13 13:16:00) 

помогите пожалуйста перевести код на дельфи:

в с#

private int[] ParseKey(string key)
{
   int result = 0;
   int length = key.Length;
   int num3 = 8;
   List list = new List(5);
   for (int i = 0; i < length; i += 8)
   {
       if ((i + 8) > length)
       {
           num3 = key.Length - i;
       }
       string s = key.Substring(i, num3);
       if (int.TryParse(s, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out result))
       {
           list.Add(result);
       }
       else
       {
           for (int j = 0; j < s.Length; j++)
           {
               result = s[j++];
               if (j < s.Length)
               {
                   result |= s[j] length) Then
           num3 = (key.Length - i)
       End If
       Dim s As String = key.Substring(i, num3)
       If Integer.TryParse(s, NumberStyles.HexNumber, CultureInfo.InvariantCulture, result) Then
           list.Add(result)
       Else
           Dim j As Integer
           For j = 0 To s.Length - 1
               result = s.Chars(j++)
               If (j < s.Length) Then
                   result = (result Or (s.Chars(j)


Юрий Зотов   (2014-03-13 22:33:00) [21]

> novichek   (13.03.14 21:44) [6]
result = s[j++];   как будет на дельфи?


j++ означает: сначала использовать текущее значение j, затем увеличить j.
На Delphi это так: result = s[j]; j := j+1;

++j означает: сначала увеличить j, затем использовать текущее значение j.
На Delphi это так:   j := j+1; result = s[j];

Но странно другое:
for (int j = 0; j < s.Length; j++) { result = s[j++]; ... }

Здесь счетчик цикла изменяется внутри самого цикла - фактически, цикл выполняется с шагом 2. Во-первых, это похоже на ошибку. Но даже если это не ошибка и даже если компилятор такое допускает, я бы так писать не стал, а использовал бы цикл while с явным увеличением на 2.


Ega23   (2014-03-13 22:08:00) [22]

for (int j = 0; j < s.Length; j++)
{
result = s[j++];


Вот за такие дела я и не люблю "квази-труъ-сишный стиль".
Зачем такие бубенца выдавать?


Inovet   (2014-03-13 22:00:00) [23]

result = s[j];
Inc(j);


novichek   (2014-03-13 21:44:00) [24]

простите, вообще запутался )

result = s[j++];   как будет на дельфи?


Inovet   (2014-03-13 21:30:00) [25]

> [4] novichek   (13.03.14 21:24)

Это потом +1 будет, а так перед ++j


novichek   (2014-03-13 21:24:00) [26]

спасибо, пришло время столкнуться с дженериками. пошел гуглить.

и с циклом что-то не могу разобраться

for (int j = 0; j < s.Length; j++)
{
result = s[j++];

если у них строка с 0, то s[j++]  если я понимаю это [j+1] куда будет ссылаться при  j = s.Length - 1 ?


Ega23   (2014-03-13 21:06:00) [27]


> -  List<int> list = new List<int>(5);
> я так понимаю тут фиксированный размер в 5 элементов массива?
>


Это не массив, это дженерик-лист.
var
 list: TList<Integer>;
begin
 list := TList<Integer>.Create;
 try
   list.Capacity := 5;
   ....
 finally
   list.Free;
 end;
end;



 procedure addResult(val: Integer);
 begin
   inc(lenResult);
   SetLength(result, lenResult);
   result[lenResult-1]:= val;
 end;


Это - лишнее, да и неправильно.


novichek   (2014-03-13 20:44:00) [28]

-  List<int> list = new List<int>(5);
я так понимаю тут фиксированный размер в 5 элементов массива?

- result = s[j++];
это s[j+1] ?

чисто для проверки, не думая про оптимизацию и т.п. набросал:

myArray  = array of Integer;

function ParseKey(key: String): myArray;
var
  _result: Integer;
  _length: Integer;
  _num3  : Integer;

  i: Integer;
  s: String;
  j: Integer;

  lenResult: Integer;

  procedure addResult(val: Integer);
  begin
    inc(lenResult);
    SetLength(result, lenResult);
    result[lenResult-1]:= val;
  end;

begin

  lenResult:= 0; _num3:= 8;
  _length:= system.Length(key);
  i:= 0;
  while i < _length do begin

      if ( (i + 8) > _length) then _num3 := _Length - i;

      s:= system.Copy(key, i, _num3);
      _result:= StrToIntDef('$'+s, -1);

      if (_result <> -1) then addResult(_result)
      else  begin

          for j:= 1 to s.Length - 1 do begin

              _result := ord(s[j+1]);

              if (j < s.Length) then  _result:= _result or  ord(s[j]) shl 16;

              addResult(_result);
          end;
      end;

      i:= i + 8;
  end;

end;

где-то так?


Rouse_   (2014-03-13 20:37:00) [29]

Помогите - это за деньги.
Мошт подсказать с непонятными моментами?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо