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)


jack128_   (2014-03-15 13:05:00) [1]


> ужасный язык

LOL. Декомпилированный код разбираешь и на язык жалуешься.


Inovet   (2014-03-15 10:10:00) [2]

Удалено модератором


novichek   (2014-03-15 02:18:00) [3]

прошу прощения - разобрался.
ужасный язык


novichek   (2014-03-14 20:25:00) [4]

Юрий Зотов, вот точно Never say "never" :)

помогите пожалуйста ещё одну процедурку переписать на дельфи.

internal static unsafe void modopt(CallConvStdcall) test(byte* array, int length, int* key, int keyLength)

непонятны вот эти строки в ней по нарастающей непонятности:

num5 = num[(int) key]    
//  это num5:= key[num]  ?
..
ushort num4 = *((ushort*) ((num2 * 2) + array));
num4:=  array[num2 * 2]  если array брать integer ?
..
(num2 * 2)[(int) array] = (num4 >> ((ushort) (0x10 - num5))) | ((ushort) (num4 << num5));

то же как Integer array[num2 * 2]:= (num4 shr Word($10 - num5)) or Word(num4 shl num5); ?

голова кипит от такого кода..


Inovet   (2014-03-14 14:24:00) [5]

В STL для vector

else if (_Capacity < size() + _Count)
 {  // not enough room, reallocate
 _Capacity = max_size() - _Capacity / 2 < _Capacity
   ? 0 : _Capacity + _Capacity / 2; // try to grow by 50%
 if (_Capacity < size() + _Count)
   _Capacity = size() + _Count;


clickmaker   (2014-03-14 13:48:00) [6]

хм... ради прикола глянул, как в дотнете

private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
 int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
 if (num < min)
 {
  num = min;
 }
 this.Capacity = num;
}
}


Ega23   (2014-03-14 13:24:00) [7]


> На Capacity как-то жирно было бы.


procedure TList.Grow;
var
 Delta: Integer;
begin
 if FCapacity > 64 then
   Delta := FCapacity div 4
 else
   if FCapacity > 8 then
     Delta := 16
   else
     Delta := 4;
 SetCapacity(FCapacity + Delta);
end;


Но Grow - виртуальный, можешь перекрыть под свою задачу.


Inovet   (2014-03-14 12:55:00) [8]

На Capacity как-то жирно было бы.


Ega23   (2014-03-14 11:37:00) [9]


> Если речь о дельфийском TList - то почти так, при необходимости
> расширяется на четверть Capacity (не уверен, что так же
> было в старых версиях, возможно, там на 16 всегда увеличение
> шло)


4 - 16 - 64 - далее на четверть от текущего. ЕМНИП.


Юрий Зотов   (2014-03-14 10:40:00) [10]

> clickmaker ©   (14.03.14 09:50) [18]

Конечно не на один (иначе бы и смысла не было). Но и не на Capacity, насколько помню. Там есть еще один параметр (название не помню, что то типа "приращение") - вот он и определяет, на сколько элементов Add должен увеличивать Capacity по дефолту.


MBo   (2014-03-14 10:31:00) [11]

>clickmaker
Если речь о дельфийском TList - то почти так, при необходимости расширяется на четверть Capacity (не уверен, что так же было в старых версиях, возможно, там на 16 всегда увеличение шло)


clickmaker   (2014-03-14 09:50:00) [12]

я так подозреваю, что List и последующие увеличения памяти производит на Capacity, а не по одному на каждый Add


Плохиш   (2014-03-14 01:59:00) [13]


> а насчет дженерика, подскажите, не могу понять что такое
> всё же Capacity
> и чем оно отличается от Count ?
>

Capacity - начальное резервирование памяти, в данном случае для 5 элементов.
Count  - действительное количество элементов.

> данная строка return list.ToArray();
>
> всё - таки вернет динамический массив array of Integer ?

А что есть сомнения?

PS. Неужели в справке не написаны ответы?


Юрий Зотов   (2014-03-13 23:51:00) [14]

> novichek   (13.03.14 23:29) [14]

> последний вопрос


Never say "never".
;o)

> при добавлении элементов я должен корректировать Capacity ?

Не знаю, как там в Шарпе и в современных Дельфях, а в Джаве - не должен. То есть - можно, но не обязательно. Элементы добавляются методом Add, а он сам все корректирует, если надо. Почти уверен, что и в Шарпе, и в современных Дельфях сделано так же. ЕМНИП, и в старых Дельфях список TList тоже так устроен.

Но полагаться на Add не всегда эффективно. Если мы точно (или хотя бы более-менее точно) знаем, сколько элементов мы собираемся добавить, то лучше сразу увеличить Capacity именно на это число, а уж потом добавлять элементы. Так мы можем избежать многократного перераспределения памяти. Понятно, что метод Add о наших планах не знает ничего и поэтому не может сработать так же хорошо, как программист.


Ega23   (2014-03-13 23:31:00) [15]


> а насчет дженерика, подскажите, не могу понять что такое
> всё же Capacity
> и чем оно отличается от Count ?


Count - сколько элементов реально помещено в список.
Capacity - вместимость, сколько элементов может быть помещено в список, разовое выделение памяти под массив элементов.


novichek   (2014-03-13 23:29:00) [16]

Юрий Зотов, очень доходчиво, спасибо.

последний вопрос, при добавлении элементов я должен корректировать Capacity ?


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

> [10] Ega23 ©   (13.03.14 22:43)
> Вот вроде бы не ошибка.

Ну. Там сначала забираем, потом увеличиваем, потом что-то там делаем и ещё раз увеличиваем. Мозг с трудом осиливает задумку.


Юрий Зотов   (2014-03-13 23:08:00) [18]

> novichek   (13.03.14 22:44) [11]
> что такое всё же Capacity и чем оно отличается от Count ?


Capacity - сколько элементов МОЖЕТ поместиться в списке
Count -  сколько элементов УЖЕ есть в списке.

Например, list.Capacity := 5 выделяет память под 5 элементов списка, но при этом Count может быть и меньше 5. Вот аналогия: полка, на которой может поместиться 5 книжек, но на самом деле их там меньше 5.

Так сделано для более эффективной работы с памятью.


novichek   (2014-03-13 22:44:00) [19]

код такой показал net reflector )

а насчет дженерика, подскажите, не могу понять что такое всё же Capacity
и чем оно отличается от Count?

данная строка return list.ToArray();

всё - таки вернет динамический массив array of Integer ?


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


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


Вот вроде бы не ошибка. Я, правда, жутко спать хочу и особо не вникал. Но то, что так писать низзя - это да.


Страницы:   1 2

Наверх

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