Главная страница
    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.037 c
6-1085536096
Пиво
2004-05-26 05:48
2004.08.29
Помогите сделать отправку письма в консольном приложении


1-1092657799
jonik_sj
2004-08-16 16:03
2004.08.29
Присвоение метода во время выполнения программы


14-1092235728
Ivolg
2004-08-11 18:48
2004.08.29
Окно


1-1092296452
V l a d i m i r
2004-08-12 11:40
2004.08.29
Как определить конец документа?


1-1092397171
Mitrofan
2004-08-13 15:39
2004.08.29
Отдельную форму в dfm формате открыть в прложении





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