Главная страница
    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
15-1332230683
Ega23
2012-03-20 12:04
2013.03.22
Ну и что, что пост? Когда нам это мешало?


15-1332519046
Rouse_
2012-03-23 20:10
2013.03.22
Оффлайн копия сайта rouse.drkb.ru


15-1335422333
Дмитрий С
2012-04-26 10:38
2013.03.22
Кадр из 112 серии интернов.


15-1330005162
Artem
2012-02-23 17:52
2013.03.22
Посоветуйте программу-терминал...


2-1342077313
AAsdr
2012-07-12 11:15
2013.03.22
MOuseMove и ширина понели на StatusBar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский