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