Функция insert char to dynamic char array работает не во всех случаях - Free Pascal
Формулировка задачи:
В порядке изобретения велосипедов написал функцию, но она вставляет значение в массив, если индекс его вставки меньше, чем длина массива. Если больше- длина прибавляется, но значение в массиве не появляется. Более детальные вопросы- в комментах к программе. Помогите разобраться, пожалуйста.
И скажите пожалуйста, как она по рациональности (кроме for при увеличении размера массива, его добавил, так как при SetLength значения не появлялись) и стилю кода и так далее... Заранее спасибо.
program insertChar;
type
AnsiCharArray = array of AnsiChar;
var
charArray1, charArray2: array of AnsiChar;
simpleChar: AnsiChar;
function charToDynCharArray(charr: AnsiChar; insertIndex: integer;
var arr: AnsiCharArray): AnsiCharArray;
var
i, arrLength: integer;
begin
if insertIndex = -1 then
insertIndex := Length(arr);
// выясняем, на сколько увел массив если...
if insertIndex > Length(arr) then
begin
// пытался прямо назначить значение длины = insertIndex+1, не добавляется значение
// в insertIndex в массив, стал делать через фор, добавлять любые значения до insertIndex
for i := Length(arr) to insertIndex do
begin
SetLength(arr, i + 1);
// добавил переменную, чтобы просматривать длину.
arrLength := Length(arr);
// почему в массив не добавляется значение? В инсп. отладки его не видно.
arr[i] := '1';
if i = insertIndex then
arr[i-1] := charr;
end;
end
else
begin
SetLength(arr, Length(arr) + 1);
for i := Length(arr) - 1 downto insertIndex + 1 do
arr[i] := arr[i - 1];
arr[insertIndex] := charr;
end;
charToDynCharArray := arr;
end;
begin
charArray2:='01';
SetLength(charArray2,101);
// почему в инспекторе отладки в charArray2 только 4 элемента?
charArray2[100]:='1';
simpleChar := '1';
charArray1 := '02';
charArray1 := charToDynCharArray(simpleChar, 1, charArray1);
simpleChar := '0';
charArray1 := charToDynCharArray(simpleChar, 0, charArray1);
simpleChar := '3';
charArray1 := charToDynCharArray(simpleChar, -1, charArray1);
simpleChar := '6';
charArray1 := charToDynCharArray(simpleChar, 6, charArray1);
ReadLn();
end.Решение задачи: «Функция insert char to dynamic char array работает не во всех случаях»
textual
Листинг программы
type
AnsiCharArr = array of AnsiChar;
procedure InsertChar(C: AnsiChar; Idx: Integer; var a: AnsiCharArr);
var i: Integer;
begin
if Idx>=Length(a) then SetLength(a,Idx+1);
for i:=Length(a)-1 downto Idx+1 do a[i]:=a[i-1];
a[Idx]:=C;
end;
var
a: AnsiCharArr;
begin
InsertChar('*',100,a);
WriteLn(a[100]='*');
end.
Объяснение кода листинга программы
- Объявление типа данных AnsiCharArr - массив символов AnsiChar
- Создание процедуры InsertChar для вставки символа в динамический массив
- Проверка индекса вставки символа, увеличение длины массива при необходимости
- Копирование символов в массиве начиная с конца и двигаясь к индексу вставки
- Вставка символа C в массив по индексу Idx
- Объявление и инициализация переменной a типа AnsiCharArr
- Вызов процедуры InsertChar для вставки символа '*' в массив a на 100-й позиции
- Запись в файл символа a на 100-й позиции
- Завершение работы программы