Недопустимая операция указателя в Delphi XE — из-за IFTHEN?

Я прочитал большинство сообщений здесь о недопустимых операциях с указателями в Delphi, и они, кажется, не применимы к этому случаю... Метод проб и ошибок привел меня к строке с проблемой, но для меня это не имеет никакого смысла. В этом примере динамический массив записей заполняется содержимым текстового файла по мере его анализа. Все работает отлично, за исключением случаев, когда память, выделенная для динамического массива, освобождается - в этом случае я получаю «Недопустимая операция указателя». Когда я меняю рассматриваемую строку с оператора ifthen на классический if-then, это работает.

Мой вопрос прост: почему первый из них не позволяет освободить память, а второй - успешно?

Первый пример:

TempFTDB[ci].FTText := ifthen(TempHolder = '', '', TempHolder + #13#10) + lr;

Второй пример:

if tempholder = '' then
    TempFTDB[ci].FTText := lr
else
    TempFTDB[ci].FTText := tempholder + #13#10 + lr;

Строка, которая освобождает память:

TempFTDB := nil;

Дальнейшее уточнение: TempFTDB — это локальная переменная, и нет других строк, освобождающих ее память. Именно в строке «TempFTDB := nil» возникает ошибка.


person b-p    schedule 06.05.2012    source источник
comment
Вы можете повторить это с новым проектом?   -  person Sertac Akyuz    schedule 07.05.2012
comment
Какого типа TempFTDB? А если ошибка возникает на строке TempFTDB := nil, то при чем тут настройка FTText?   -  person NGLN    schedule 07.05.2012
comment
@NGLN — TempFTDB — это массив записей. FTText — короткое поле записи   -  person b-p    schedule 08.05.2012


Ответы (2)


Обычно такая проблема при использовании IfThen связана с тем, что метод IfThen ожидает 2 строки, как вы можете видеть в сигнатуре метода:

function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string;

Я не знаю, является ли код, который вы разместили, реальным кодом, но я могу предположить, что значение «False» находится в неправильном состоянии, и метод IfThen всегда будет выполнять оба условия.

Таким образом, если вы передаете методу значение "False", и этот метод зависит от того, является ли ваше условие ложным для его выполнения, это может привести к неожиданному поведению, поскольку он всегда будет выполняться.

person Fabio Gomes    schedule 07.05.2012

Хорошо... Оказывается, вышесказанное было своего рода отвлекающим маневром. Ошибка возвращалась всякий раз, когда вышеупомянутая процедура (взятая выше) запускалась во второй раз - определенно звучит как нераспределенная память ... Непосредственно перед кодом, размещенным выше, была процедура для перенумерации элементов во временном массиве записей, и в нем была проблема... (досадная маленькая ошибка..)

Я имел:

for i := 0 to length(FTDBFileBuffer_RTF) do
  begin
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber;
  end;

вместо

for i := 0 to length(FTDBFileBuffer_RTF) - 1 do //notice the - 1
  begin
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber;
  end;

Теперь проблема чисто академическая... Почему присутствие или отсутствие команды ifthen приводит к отображению ошибки?

person b-p    schedule 08.05.2012
comment
Ошибки станут ошибочными, когда память будет ложно перезаписана, как в вашем случае при записи записи в нераспределенную область памяти. - person LU RD; 08.05.2012