Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

Записи(record)   Найти похожие ветки 

 
Coder: TCoder;   (2004-08-11 11:08) [0]

Предположим что:

type
 TSomeRecord = record
   I: integer;
 end;
var
 T: TSomeRecord;
 P: ^TSomeRecord;

Что происходит при:
 1) T := P^; //область памяти где находится их структура  
             //копируется в нашу? или меняется лишь указатель?
 2) P^ := T; //а здесь?
 3) P^.I := T.I //меняется значение или адрес?
 4) T.I := P^.I //и здесь?

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?


 
icWasya ©   (2004-08-11 11:15) [1]

Что происходит при:
1) T := P^; //область памяти где находится их структура (P^)  
            //копируется в нашу (T)
2) P^ := T; //в P присваивается указатель на T
3) P^.I := T.I //меняется значение
4) T.I := P^.I //меняется значение

кроме того
5) New(P); // в куче создаётся новая структура
           // и указатель на неё присваивается в P

6) Dispose(P); // из кучи по указателю P удаляеncя структура
               // указатель P не обнуляется

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?

если сделано 2) то не надо, а если 5), то надо делать 6)


 
TopT   (2004-08-11 11:16) [2]

Во всех случаях копируется содержимое, указатели остаются неизменными.
>>И еще один вопрос: нужно ли освобождать записи объявленные в секции var?
Если это поинтеры и ты резервировал под них память с помощью new getmem и тд. то нужно.


 
Ega23 ©   (2004-08-11 11:18) [3]

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?

Нет, надо освобождать память по этим указателям.
Грубо говоря, на каждый New должен быть свой Dispose, на каждый GEtMem - FreeMem, на каждый Create - Free.


 
Coder: TCoder;   (2004-08-11 11:24) [4]

Большое спасибо!!!


 
Sandman25 ©   (2004-08-11 11:25) [5]

[1] icWasya ©   (11.08.04 11:15)

Во втором пункте ошибка.


 
icWasya ©   (2004-08-11 13:06) [6]

[5] Sandman25
 Рву последние волосы (не скажу где)

итак
2) P^ := T; //в область памяти, на которую ссылается P,
           //копируется структура T
и соответственно ответ на последний вопрос читать в редакции Ega23 [3]


 
Erik1   (2004-08-11 13:38) [7]

Есть еще один нюанс, если мы передаем в процедуру T то всеравно нередается указатель на структуру. Следовательно если в ней сделать Dispose то будет освобождена базовая структура, повторное освобождение после возврата из процедуры приведет к ошибке.


 
Sandman25 ©   (2004-08-11 14:23) [8]

[7] Erik1   (11.08.04 13:38)

В смысле? Передавать можно
T, const T, var T, P
Dispose можно сделать только для последнего варианта


 
Ega23 ©   (2004-08-11 14:29) [9]

Sandman25 ©   (11.08.04 14:23) [8]

Нет, ну почему?

Правда результат забавный и непредсказуемый будет:

procedure TForm1.Button2Click(Sender: TObject);

procedure AAA(const P:PInteger);
begin
Dispose(P);
end;

var
P:PInteger;

begin

New(P);
P^:=5;
AAA(P);
ShowMessage(IntToStr(P^));
end;



 
Sandman25 ©   (2004-08-11 14:41) [10]

[9] Ega23 ©   (11.08.04 14:29)

Это и есть последний вариант, с передачей P.


 
Ega23 ©   (2004-08-11 14:45) [11]

Sandman25 ©   (11.08.04 14:41) [10]

Тьфу, я только 3 варианта увидел  :о)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
1-1092216937
Denis
2004-08-11 13:35
2004.08.29
В каком случае выполняется событие OnShow при создании формы?


8-1086496810
Артем К.
2004-06-06 08:40
2004.08.29
Как продублировать картинку по окружности?


14-1091886853
able
2004-08-07 17:54
2004.08.29
НАШЕствие


3-1091786283
Alex_Bredin
2004-08-06 13:58
2004.08.29
Получить все FK в базе


14-1091636877
Piter
2004-08-04 20:27
2004.08.29
Посоветуйте Гостевую книгу на php написанную





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