Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизМассивы и указатели. Что я делаю не так? Найти похожие ветки
← →
noob_one (2011-01-19 13:35) [0]
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]; дожна возвращать ссылку.
Что не так и как правильно?
← →
Palladin © (2011-01-19 14:01) [1]record без end
что ты знаешь о динамических массивах?
← →
12 © (2011-01-19 14:51) [2]все работает
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;
← →
noob_one (2011-01-19 15:16) [3]> [2] 12 © (19.01.11 14:51)
Спасибо что попробовали и проверили.
Значит у меня где-то еще ошибка. Буду искать.
← →
12 © (2011-01-19 15:57) [4]области видимости проверьте
← →
KSergey © (2011-01-20 09:44) [5]> 12 © (19.01.11 15:57) [4]
> области видимости проверьте
Есть подозрение, что у автора "попадает" после добавления элементов в массив. Что естественно.
Автор, зачем вы всех обманываете? в приведенном примере, я уверен, ничего никуда не пропадает. Это не полный пример пропадания.
> 12 © (19.01.11 14:51) [2]
> все работает
Если перед последним end; добавить две строчкиSetLength(ImportFields, 100);
ShowMessage( P.FieldName );
то легко может и рвануть, и правильно.
← →
noob_one (2011-01-20 11:07) [6]> Автор, зачем вы всех обманываете? в приведенном примере,
> я уверен, ничего никуда не пропадает. Это не полный пример
> пропадания.
Да, но весь пример работы слишком большой.
Как выяснилось уже ближе к ночи, я забыл напрочь про еще одно событие, в котором было еще одно присваивание.
>Если перед последним end; добавить две строчки
Не-не, сначала инициализация, потом указатели.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.087 c