Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1242060813
v1keeee
2009-05-11 20:53
2009.07.05
Не пойму в чем дело с TreeView


8-1194476253
Проходящий мимо
2007-11-08 01:57
2009.07.05
Flash


2-1242628077
Игорь
2009-05-18 10:27
2009.07.05
Как правильно передать PChar из DLL


15-1241037006
Юрий
2009-04-30 00:30
2009.07.05
С днем рождения ! 30 апреля 2009 четверг


2-1242569052
Святослав
2009-05-17 18:04
2009.07.05
Вывод текста на форме вертикально





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