![]() |
| ||
|
|
Новости |
Поиск |
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)
Юрий Зотов (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]Помогите - это за деньги.
Мошт подсказать с непонятными моментами?