Главная страница
    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.03 c
1-1092606277
Vetalich
2004-08-16 01:44
2004.08.29
Замена символов


1-1092295033
Масалыга Андрей
2004-08-12 11:17
2004.08.29
Как создать папку?


4-1089376136
Дмитрий2004
2004-07-09 16:28
2004.08.29
Программа работающая под определенным пользователем


1-1092216167
Tex
2004-08-11 13:22
2004.08.29
Работа с динамическим массивом


4-1089779383
Константин
2004-07-14 08:29
2004.08.29
нажатие на TMenuItem





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