1

質問は少しあいまいに思えるかもしれませんが、素人の言葉でそれを分解しようとします.

またはByteのみを含む24 個の値の配列があるとします。01

011000100000001000000111

配列は、グループごとに 4 つの値のグループに論理的に分割されます。

0110 0010 0000 0010 0000 0111

ここで、少なくとも1 つの値が に設定されている後続のグループの数を数えたいと思います1。私が提供した例では、2後続のグループがあります。

プログラムでそれをどのように行うべきですか?

4

2 に答える 2

5

Arnaudの答えに基づいています。これは正しい考えを持っていますが、OPが要求したことを実際には実行しません:

function CountNonNullGroupSequenceLength(Values: PByte; ValuesCount: integer): integer;
var Groups: PIntegerArray;
    i, counter: integer;
begin
  Groups := Values;
  result := 0;
  counter := 0;
  for i := 0 to (ValuesCount shr 2)-1 do
    if Groups[i]<>NULLGROUP then
      inc(counter)
    else begin
      result := max(result, counter);
      counter := 0;
    end;
  result := max(result, counter);
end;

関数を取得できるように、使用リストに必ず入れMathてください。Max

于 2012-04-25T17:53:59.347 に答える
2

グループは 4 バイトであるため、これは 4 バイトを 1 つの整数に型変換したようなものです。

例えば:

const
  NULLGROUP = 0;

function CountNonNullGroups(const Values: TByteArray): integer;
var Groups: TIntegerArray absolute Values;
    i: integer;
begin
  result := 0;
  for i := 0 to (length(Values) shr 2)-1 do
    if Groups[i]<>NULLGROUP then
      inc(result);
end;

またはポインタを使用して:

function CountNonNullGroups(Values: PByte; ValuesCount: integer): integer;
var Groups: PIntegerArray;
    i: integer;
begin
  Groups := Values;
  result := 0;
  for i := 0 to (ValuesCount shr 2)-1 do
    if Groups[i]<>NULLGROUP then
      inc(result);
end;
于 2012-04-25T16:27:41.590 に答える