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

Вниз

Вопрос по указателям   Найти похожие ветки 

 
Dan   (2008-01-11 18:27) [0]

Допустим, есть некий класс:

type
 PClass = ^TClass;
 TClass = class
 public
   Field1 : Byte;
   Field2 : Integer;
   Field3 : String;
 end;

Самый быстрый и лучший способ работы с классом этот:

...
var
   C : TClass;
 pC : PClass;
begin
 pC := @C; pC^ := TClass.Create; pC^.Field := 1;
end;
...

или этот:

...
var C : TClass;
begin
 C := TClass.Create; pC.Field := 1;
end;
...

P.S. Думаю, через указатели быстрее.


 
Джо ©   (2008-01-11 18:30) [1]

C : TClass — это УЖЕ указатель.


 
@!!ex ©   (2008-01-11 18:32) [2]

Парень, не совершай ошибки...
потом заколебешься ее разгребать.. Я пол года баги в проекте ловил...
Забуть о PClass = ^TClass;

В таком случае:
C : TClass;
С - уже является указателем на класс!!! PClass - это указатель, на указатель... Такая хренатень ведет к очень неприятным багам, которые сложно поймать... слава всем богам, мне вовремя объяснили, что не надо использовать указатели на указатели, иначе бы мы проект так и не сдали...


 
Palladin ©   (2008-01-11 18:33) [3]

как все жестоко...


 
MetalFan ©   (2008-01-11 18:38) [4]


> P.S. Думаю, через указатели быстрее.

конечно быстрее... через попу ухо пяткой чесать всегда быстрее)


 
Dib@zol ©   (2008-01-11 18:45) [5]

> конечно быстрее... через попу ухо пяткой чесать всегда быстрее)

Ну не совсем через попу, коненчно, однако чревато потерей драгоценных четырёх байт, а также одним лишним присвоением при обращении к классу. Более того, могут возникнуть трудноловимые ерроры при разыменовании. Скажем, первый поинтер ты разыменовал, и надеешься увидеть в полученной области памяти структуру класса. Пробуешь читать... И ловишь AV, ибо там не класс, а лишь второй поинтер, по которому ышшо надо лишний раз перейти.


 
Kolan ©   (2008-01-11 18:46) [6]

> конечно быстрее&#133 через попу ухо пяткой чесать всегда быстрее)

И главное понятнее :)


 
Dan   (2008-01-11 18:53) [7]

Понятно! А с рекордами та же каша?


 
Правильный_Вася   (2008-01-11 18:54) [8]


> через попу ухо пяткой чесать всегда быстрее

это называется инкапсуляция


 
Palladin ©   (2008-01-11 18:55) [9]

нет конечно, идентификатор recordа в памяти имеет ту же структуру что и описана (хотя конечно есть различия между packed и не packed)


 
Dan   (2008-01-11 18:59) [10]


> Palladin ©

Значит с рекордами лучше работать через указатель? Или нет?


 
Palladin ©   (2008-01-11 19:02) [11]

ну ты интересный вопрос спросил... он настолько широкий, что кроме того, что: все это зависит от ситуации и задачи, я тебе ничего ответить не могу...


 
WMZ   (2008-01-11 19:05) [12]


> Palladin ©

Хорошо! Если рекорд большой(т.б. внутри присутсвуют переменный типа Byte, String, Integer, Double, различные массивы и пр.) значит через указатели, иначе - нет.
Так?


 
Kolan ©   (2008-01-11 19:06) [13]

Что тебе надо сделать объясни&#133


 
Palladin ©   (2008-01-11 19:07) [14]


> [12] WMZ   (11.01.08 19:05)

нет не так, от размера рекорда ничего не зависит


 
Юрий Зотов ©   (2008-01-11 19:07) [15]

> WMZ   (11.01.08 19:05) [12]

Тоже зависит от ситуации. Размер записи сам по себе ничего не определяет.


 
Джо ©   (2008-01-11 19:08) [16]

> [12] WMZ   (11.01.08 19:05)
>
> > Palladin ©
>
> Хорошо! Если рекорд большой(т.б. внутри присутсвуют переменный
> типа Byte, String, Integer, Double, различные массивы и
> пр.) значит через указатели, иначе - нет.
> Так?

От того, что ты заведешь указатель на что бы то ни было, быстрее ничего не станет. Откуда такие странные представления вообще?


 
Dan   (2008-01-11 19:09) [17]

Мне нужно, понять, когда лучше работать с указателями(record), а когда - напрямую.


 
Джо ©   (2008-01-11 19:11) [18]

> [17] Dan   (11.01.08 19:09)
> Мне нужно, понять, когда лучше работать с указателями(record)
> , а когда - напрямую.

Когда нужно выделять память под запись динамически, тогда и нужно использовать указатель. Остальные случаи слишком специфичны, чтобы их тут обсуждать.


 
{RASkov} ©   (2008-01-11 19:12) [19]

> [12] WMZ   (11.01.08 19:05)

Смотря что ты с этим рекордом делать будешь.... если просто читать и/или менять его составные то нет смысла в указателях....

Указатель чем отличается от переменной не указателя (например рекорд) ?
Да, да... указатель он всегда 4 байта.... поэтому сортировка данных, например в массиве, быстрее организовать с указателями...., чем реальные, большого размера, данные перекладывать в памяти с места на место..... Вот и думай когда быстрее указатель, а когда от него нет толку....
И вообще они остались для совместимости :)


 
{RASkov} ©   (2008-01-11 19:12) [20]

Блин.... как здесь быстро отвечают :)


 
Dib@zol ©   (2008-01-11 19:12) [21]

> Значит с рекордами лучше работать через указатель? Или нет?

А вот тут как раз моногенитально, как с ним работать. Но опять же если работать через указатели, то имеем одно лишнее присвоение.

ЗЫ а если уж так хочется попробовать поработать с указателями, попробуй сгенерировать хотя бы шестнадцативершинный граф со случайными связями (макс. 4 шт. на один узел) и попытаться найти в этом графе циклический маршрут.


 
Dan   (2008-01-11 19:18) [22]

Ладно! Всем спасибо за ответы.



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

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

Наверх





Память: 0.5 MB
Время: 0.042 c
15-1198671913
vajo
2007-12-26 15:25
2008.02.03
Win Vista Busines нормально работатет со SCSI дисками?


2-1199382645
buka
2008-01-03 20:50
2008.02.03
Почему не работает в ADOTable?


4-1183109513
евнен
2007-06-29 13:31
2008.02.03
форматирование диска без участия пользователя


2-1199426201
Alexandr Malygin
2008-01-04 08:56
2008.02.03
не отображается label на появляющейся на некоторое время форме


3-1190566340
Motzart_Motzart
2007-09-23 20:52
2008.02.03
Найти все MSSQL servers в сети





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