Главная страница
    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.067 c
2-1331024938
leklerk
2012-03-06 13:08
2013.03.22
Достаточно ли одного ADOConnection?


2-1332675320
Pcrepair
2012-03-25 15:35
2013.03.22
Парсинг текста и использование рег.выражений?


2-1331468421
Димка На
2012-03-11 16:20
2013.03.22
Создать несколько экз. класса сразу.


15-1354292775
Очень Злой
2012-11-30 20:26
2013.03.22
Оптимизировать код


15-1332243086
Kerk
2012-03-20 15:31
2013.03.22
Google Hangouts





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