![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведение типов в циклах
TStas © (2009-05-18 22:39:00)В книжках написано, что приведение типов, вроде P := Pointer(C), где C: Cardinal, меняе точку зрения компилятора на данные, содержащиеся по указанному адресу, но не преобразует сами данные. Как лучше сделать внутри больших циклов, каждый раз приводить тип, если компилятор не генерит лишний код, или как-то иначе сделать?
Anatoly Podgoretsky (2009-05-19 11:04:00) [1]> Игорь Шевченко (19.05.2009 11:00:22) [22]
Поллитра - разбить
(Ы)
Игорь Шевченко (2009-05-19 11:00:00) [2]
> И Пачеко тоже?
все до единой.
Anatoly Podgoretsky (2009-05-19 08:58:00) [3]> Игорь Шевченко (19.05.2009 0:37:18) [18]
И Пачеко тоже?
Anatoly Podgoretsky (2009-05-19 08:55:00) [4]> TStas (18.05.2009 23:55:16) [16]
Нолик определен примерно так
const
buf: char = #0;
И длина строки - StrLen(Buf) = 0
Не путай с размером буфера, который на единицу больше длины строки.
Германн (2009-05-19 00:42:00) [5]
> Игорь Шевченко © (19.05.09 00:37) [18]
>
>
> > Свои книжки тоже выбрось
>
>
> да вообще все книжки надо сжечь, от них брожение в мозгу
>
А Мы Вам ответим - 451!
:)
Игорь Шевченко (2009-05-19 00:37:00) [6]
> Свои книжки тоже выбрось
да вообще все книжки надо сжечь, от них брожение в мозгу
Германн (2009-05-19 00:25:00) [7]
> ТВлад (18.05.09 22:43) [1]
>
>
> > TStas © (18.05.09 22:39)
> > В книжках написано, что приведение типов, вроде P := Pointer(C),
> где C: Cardinal, меняе точку зрения компилятора на данные,
> содержащиеся по указанному адресу, но не преобразует сами
> данные.
>
> Выбросьте эти книжки. Компилятору всёравно.
Свои книжки тоже выбрось. Компилятор действительно "меняет точку зрения на данные". Именно для этого и сделана возможность приведения типов.
А насчёт "преобразования самих данных", в одном единственном частном случае, уже сказано достаточно.
TStas (2009-05-18 23:55:00) [8](14) Как же нулю? А нолик, который #0, он же байт занимает? Я понимаю, что есть некая константа, в которой адрес нолика этого, который только чиать можно, записан. Но у него же не 0, 1 размер? Но, что память не выделяется, я тоже понял, так как кроме нлика там нету ничего.
Anatoly Podgoretsky (2009-05-18 23:39:00) [9]> TStas (18.05.2009 23:32:14) [14]
Почти правильно, только не выделяет и не пишет, а это говтовый буфер из одного байта, в кодовом сегменте, что означает только для чтения. Писать то некуда, поскольку размер равен 0
TStas (2009-05-18 23:32:00) [10][13] Конечно. А... Вот теперь понял! Именно на нил-то строчка и проверяется, уж не нил ли она, это и делает вызываемая функция. А если нил, то выделяет байт памяти и него нолик пишет. Так?
Сергей М. (2009-05-18 23:26:00) [11]
> Он на размер записи увеличится?
>
Обязан ..
Anatoly Podgoretsky (2009-05-18 23:26:00) [12]> TStas (18.05.2009 23:20:11) [11]
А пустая строка в виде PChar - это не NIL, а указатель на буфер, где только один символ - завершающийся нулевым символом (#0).
Len(PChar(nil) = 0,
Adr(PChar(nil) <> nil
TStas (2009-05-18 23:20:00) [13]>[8] А пустая строка - это нил.
>[9] Вот спасибо большое! А Inc если к типизированному указателю применять, он правильно увеличится? Ну вот:
TExecRec = record ...//Определение записи
PExecRec = ^TExecRec; //Определение типа указателя
P: PExecRec; Inc(P). Он на размер записи увеличится?
Anatoly Podgoretsky (2009-05-18 23:17:00) [14]> Игорь Шевченко (18.05.2009 23:15:09) [9]
Приведение никогда код не меняет, иначе это не приведение, а преобразование или функция.
Игорь Шевченко (2009-05-18 23:15:00) [15]
> Как не говорю? Типы Cardinal/Pointer
Приведение типов из Cardinal в Pointer и наоборот в 32-х битной системе код не меняет
Anatoly Podgoretsky (2009-05-18 23:11:00) [16]> TStas (18.05.2009 22:53:05) [5]
Теперь попробуй тоже самое применить к пустой строке.
Сергей М. (2009-05-18 22:59:00) [17]
> одно-два - без разницы, а 1000 000 000 - это очень плохо
Чтой-то вдруг ?)
Один раз - не п.рас ?))
TStas (2009-05-18 22:54:00) [18]>[4] Это-то понятно, что ничем. Просто одно-два - без разницы, а 1000 000 000 - это очень плохо.
TStas (2009-05-18 22:53:00) [19]Игорь, чтобы сделать как-нибудь, надо ещё класс целый написать и отладить его.
Как не говорю? Типы Cardinal/Pointer
А вот что при приведении String к Pchar вызов получается, не знал. Переменная типа String - это же указатель, только работа с ним автоматизорована. И указывает она на начало самих символов. На четыре байта слево - Length, а ещё на 4 влево - RefCount. Я специально всякие экперименты проводил. Всё так, как в статье в форума и в книжке.
Сергей М. (2009-05-18 22:50:00) [20]
> Приведение типов в циклах
.. ничем не отличается от оного внециклов