Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.06 c
2-1329719235
Andrewtitoff
2012-02-20 10:27
2013.03.22
Путь к БД ADOConnection


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


15-1339739244
Demo
2012-06-15 09:47
2013.03.22
Купить интернет магазин


15-1346838937
GanibalLector
2012-09-05 13:55
2013.03.22
Tagged PDF


15-1330115402
Юрий
2012-02-25 00:30
2013.03.22
С днем рождения ! 25 февраля 2012 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский