![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
С# - Delphi
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.
Вот вроде бы не ошибка. Я, правда, жутко спать хочу и особо не вникал. Но то, что так писать низзя - это да.