Информация об изменениях

Сообщение Re[2]: Использование переменных цикла после цикла от 14.09.2023 8:54

Изменено 14.09.2023 8:55 Khimik

Re[2]: Использование переменных цикла после цикла
Здравствуйте, T4r4sB, Вы писали:

TB>Да. Используй цикл while, потому что for в С++ и Дельфи не всегда невзаимозаемы.

TB>Одно в другое можно перевести только в простом случает когда переменная цикла объявляется прямо в заголовке цикла, имеет соавнение с числом в качестве верхнего условия и инкремент/декремент на единичку в качестве перехода

Ок, вот этот перевод корректный?

function cbsizeofints(num_of_ints: Integer; sizes: array of int64): Integer;
var
  i, num: Integer;
  num_of_bytes, num_of_bits, bytecnt, tmp: int64;
  bytes: array[0..31] of int64;
begin
  num_of_bytes := 1;
  bytes[0] := 1;
  num_of_bits := 0;

  for i := 0 to num_of_ints - 1 do
  begin
    tmp := 0;
    bytecnt:=0;
    while bytecnt<num_of_bytes - 1 do
    begin
      tmp := bytes[bytecnt] * sizes[i] + tmp;
      bytes[bytecnt] := tmp and $ff;
      tmp := tmp shr 8;
      inc(bytecnt);
    end;

    while tmp <> 0 do
    begin
      bytes[bytecnt] := tmp and $ff;
      tmp := tmp shr 8;
      Inc(bytecnt);
    end;

    num_of_bytes := bytecnt;
  end;

  num := 1;
  Dec(num_of_bytes);

  while bytes[num_of_bytes] >= num do
  begin
    Inc(num_of_bits);
    num := num * 2;
  end;

  Result := num_of_bits + num_of_bytes * 8;
end;
Re[2]: Использование переменных цикла после цикла
Здравствуйте, T4r4sB, Вы писали:

TB>Да. Используй цикл while, потому что for в С++ и Дельфи не всегда невзаимозаемы.

TB>Одно в другое можно перевести только в простом случает когда переменная цикла объявляется прямо в заголовке цикла, имеет соавнение с числом в качестве верхнего условия и инкремент/декремент на единичку в качестве перехода

Ок, вот этот перевод корректный?

function cbsizeofints(num_of_ints: Integer; sizes: array of int64): Integer;
var
  i, num: Integer;
  num_of_bytes, num_of_bits, bytecnt, tmp: int64;
  bytes: array[0..31] of int64;
begin
  num_of_bytes := 1;
  bytes[0] := 1;
  num_of_bits := 0;

  for i := 0 to num_of_ints - 1 do
  begin
    tmp := 0;
    bytecnt:=0;
    while bytecnt<num_of_bytes - 1 do
    begin
      tmp := bytes[bytecnt] * sizes[i] + tmp;
      bytes[bytecnt] := tmp and $ff;
      tmp := tmp shr 8;
      inc(bytecnt);
    end;

    while tmp <> 0 do
    begin
      bytes[bytecnt] := tmp and $ff;
      tmp := tmp shr 8;
      Inc(bytecnt);
    end;

    num_of_bytes := bytecnt;
  end;

  num := 1;
  Dec(num_of_bytes);

  while bytes[num_of_bytes] >= num do
  begin
    Inc(num_of_bits);
    num := num * 2;
  end;

  Result := num_of_bits + num_of_bytes * 8;
end;


Тут мне не совсем понятно, если превращать for в while, инкремент надо ставить в начале теле цикла, или в конце.