2

Aループを使用して各要素を新しい宛先に移動できるという事実を認識していますが、この問題に対するより単純で洗練された解決策はありますか?明らかに、MOVEAは同じアレイでは機能しないため、ここではあまり役に立ちません。

4

2 に答える 2

2

関数を使用してシフトダウンしSUBARRます。

 /FREE
    %subarr(array:1) = %subarr(array:2); // Shift elements
    array(%elem(array)) = *blanks;       // Reset the remaining element
 /END-FREE

C                   EVAL      %SUBARR(array:1) = %SUBARR(array:2)
C                   EVAL      array(%ELEM(array)) = *BLANKS

シフトアップには、オーバーラップのため、一時的な配列またはストレージを使用する必要があります。

于 2012-09-19T04:34:34.670 に答える
0

memmove() - Copy Bytes C ライブラリ関数は、オーバーラップするメモリ領域を左から右または右から左に安全にコピーできます。私にとっての用途の 1 つは、埋め込まれたアポストロフィの文字列をスキャンした後です。見つかった場合は、その位置から始まる文字列を取得し、バイトを 1 桁右に移動 (つまり、「コピー」) します。これにより、二重の埋め込みアポストロフィが作成され、後続のすべてのバイトが 1 桁シフトされます。

この関数は新しい位置へのポインターも返します。このポインター (プラス 1) を開始点として使用して、文字列の残りの部分をスキャンし、次の埋め込まれたアポストロフィを探します。スキャンでヒットが返されなくなるまでループします。文字列は基本的に単なるバイトの「配列」であるため、実際の配列と同様に機能します。

于 2014-04-06T13:34:54.097 に答える