Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Массивы и указатели. Что я делаю не так?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
15-1337891402
Юрий
2012-05-25 00:30
2013.03.22
С днем рождения ! 25 мая 2012 пятница


15-1352825506
>|<
2012-11-13 20:51
2013.03.22
Определение границ максимальной плотности точек


2-1331751635
White
2012-03-14 23:00
2013.03.22
Сбивается БД


15-1329458550
coward
2012-02-17 10:02
2013.03.22
FreeSoft AV


15-1337027405
Юрий
2012-05-15 00:30
2013.03.22
С днем рождения ! 15 мая 2012 вторник