- Код: Выделить всё
TRealArray = array of Real;
PRealArray=^TRealArray;
Задача: Прочитав данные из TMemoryStream, обработать их и поместить в переменную типа TRealArray, и положить в Tlist.
Вот код (оставил только логику)
- Код: Выделить всё
function F1(const AData: TMemoryStream): TRealArray;
begin
Result:=Nil;
if (AData=nil) then exit;
SetLength(Result,N);
//далее работаем с созданным массивом, заполняем его данными
end;
procedure AddData1(const AData: TMemoryStream);
var NewData:PRealArray;
begin
if (AData=nil) or (AData.Size<=FCountPoint) then exit;
NewData:=New(PRealArray);
NewData^:= F1(AData);
if NewData^=nil then
begin
Dispose(NewData);
Exit;
end;
Data.Add(NewData);
end;
//процедура проверки полученных данных (вывод в файл)
procedure ShowResult;
var
FText:TextFile;
SData:TRealArray;
Begin
if Data[0]=nil then
exit;
AssignFile(FText,'C:\Spectr.txt');
Rewrite(FText);
SData:=PRealArray(Data[0])^;
for I:=1 to High(SData) do
Writeln(FText,FloatToStr(SData[I]));
CloseFile(FText);
//Data[0]:=nil;
//dispose(PRealArray(Data[0]));
End;
Проверил, все хорошо работает файл и данные верные.
Вопрос: в конце процедуры ShowResult, закомментированы две строчки, которые должны будут освободить память, какую применять более верно.?
Т.к используем выделение памяти при помощи New. То dispose более верно, это так?
Вариант 2:
Ведь можно переписать процедуры так:
- Код: Выделить всё
procedure AddData1(const AData: TMemoryStream);
var NewData:TRealArray;
begin
if (AData=nil) or (AData.Size<=FCountPoint) then exit;
NewData:= F1(AData);
if NewData<>nil then
Data.Add(@NewData); //Вот тут сомнения так ли?
//может нужно так Data.Add(@NewData[0])
end;
//процедура проверки полученных данных (вывод в файл)
procedure ShowResult;
var
FText:TextFile;
SData:TRealArray;
Begin
if Data[0]=nil then
exit;
AssignFile(FText,'C:\Spectr.txt');
Rewrite(FText);
SData:=TRealArray(Data[0]^);
for I:=1 to High(SData) do
Writeln(FText,FloatToStr(SData[I]));
CloseFile(FText);
//Data[0]:=nil;
//dispose(PRealArray(Data[0]));
End;
Процедура AddData1 уменьшилась и стала более наглядной, но вот в ShowResult в SData передается мусор, (что не так я делаю?). Возможно из-за того, что в процедуре ShowResult мы использовали не указатель, а локальную переменную (мое предположение) вследствие чего в Data.Add(@NewData); записали указатель, на массив, который потом был удален.
т.е остается верным только первый варинат?
PS. Что то я запутался
