![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массивы и указатели. Что я делаю не так?
noob_one © (2011-01-19 13:35:00)
type
TImportField=record
Displaylabel, FieldName: ShortString;
DefNum,ColNum:Integer;
PImportField=^TImportField;
TImportFieldList=array of TImportField;
var
ImportFields:TImportFieldList;
Function GetImportFieldByFieldName(const FieldName:string):PImportField;
var
L,I: Integer;
begin
Result:=nil;
L:=Length(ImportFields);
for I := 0 to L - 1 do
if ImportFields[I].FieldName=FieldName
then
begin
Result:=@ImportFields[I];
Exit;
end;
end;
Функция используется для доступа к элементу массива по FieldName.
Чтение проходит хорошо, запись проходит без ошибок, но записанное значение попадает.
Обычно это значит что работа идет с копией элемента, но насколько я понимаю запись Result:=@ImportFields[I];дожна возвращать ссылку.
Что не так и как правильно?
noob_one (2011-01-20 11:07:00) [1]> Автор, зачем вы всех обманываете? в приведенном примере,
> я уверен, ничего никуда не пропадает. Это не полный пример
> пропадания.
Да, но весь пример работы слишком большой.
Как выяснилось уже ближе к ночи, я забыл напрочь про еще одно событие, в котором было еще одно присваивание.
>Если перед последним end; добавить две строчки
Не-не, сначала инициализация, потом указатели.
KSergey (2011-01-20 09:44:00) [2]> 12 © (19.01.11 15:57) [4]
> области видимости проверьте
Есть подозрение, что у автора "попадает" после добавления элементов в массив. Что естественно.
Автор, зачем вы всех обманываете? в приведенном примере, я уверен, ничего никуда не пропадает. Это не полный пример пропадания.
> 12 © (19.01.11 14:51) [2]
> все работает
Если перед последним end; добавить две строчки
SetLength(ImportFields, 100);
ShowMessage( P.FieldName );
то легко может и рвануть, и правильно.
12 (2011-01-19 15:57:00) [3]области видимости проверьте
noob_one (2011-01-19 15:16:00) [4]> [2] 12 © (19.01.11 14:51)
Спасибо что попробовали и проверили.
Значит у меня где-то еще ошибка. Буду искать.
12 (2011-01-19 14:51:00) [5]все работает
Function GetImportFieldByFieldName(const FieldName:string):PImportField;
var
L,I: Integer;
begin
Result:=nil;
L:=Length(ImportFields);
for I := 0 to L - 1 do
if ImportFields[I].FieldName=FieldName then
begin
Result:=@ImportFields[I];
Exit;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
P: PImportField;
i: integer;
s:string;
begin
SetLength(ImportFields, 5);
ImportFields[0].FieldName := '000';
ImportFields[1].FieldName := '111';
ImportFields[2].FieldName := '111';
ImportFields[3].FieldName := '222';
ImportFields[4].FieldName := '999';
s:='';
for i:= 0 to 4 do S:=s+ImportFields[i].FieldName+' ';
ShowMessage( s );
P := GetImportFieldByFieldName('111');
P.FieldName := '563';
P := GetImportFieldByFieldName('222');
P.FieldName := 'asd';
s:='';
for i:= 0 to 4 do S:=s+ImportFields[i].FieldName+' ';
ShowMessage( s );
end;
Palladin (2011-01-19 14:01:00) [6]record без end
что ты знаешь о динамических массивах?