|
|
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Добрый день. Изучаю указатели. Вычитал, что получить адрес первого байта данных переменной i можно разными способами, в частности, так Код: pascal 1. и так Код: pascal 1. . Если бы i была переменной типа String, то p содержала бы разные значения. Но у меня i имеет тип integer. И происходит интересная вещь. Если я пишу Код: pascal 1. , то все работает так, как должно. А вот если я пишу Код: pascal 1. , то начинается непонятная мне ерудна. Функция Код: pascal 1. вместо адреса первого байта переменной i возвращает значение переменной i! А операция Код: pascal 1. вместо значения переменной i вообще приводит к краху программы. В моей справке (Delphi 7) я такой функции Pointer(X) не нашел. Гуглом получилось найти несколько примеров. Пытаюсь их повторить - у меня не работает :-( Подскажите, пожалуйста, что за функция такая Pointer(переменная), что она возвращает, для чего нужна? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:34 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_Федор Код: pascal 1. Это приведение типов. С тем же успехом можно написать p := TObject(i). но i от этого не станет объектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:40 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_Федор, pointer(X) - ты делаешь приведение типов, а не взятие адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:42 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_Федор, странная у вас книжка, может там всё же как-то по другому написано? вообще синоним-функция называется Addr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:50 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
DarkMaster, всем спасибо! А что такое приведение типов? Преобразование? Я разбираю чужой код, где используются указатели. Код: pascal 1. 2. 3. 4. 5. 6. 7. Я не понимаю, зачем нужна строка Код: pascal 1. и что делает функция Pointer? Ранее, автор кода писал так: pPixel:=pByte(pLine). Я это понимаю так. Есть типизированный указатель pLine. Он ссылается на 1-й байт огромного массива. Используя этот указатель, можно прыгать по элементам массива и полям (например, так pLine^[k].R). Но нам это неудобно. Мы хотим получить ссылку на первый байт, а потом выбирать, например, каждый 3-й байт. Тогда мы производим преобразование типов: pPixel:=pByte(pLine). pPixel - это ссылка на трехбайтный тип. Поэтому псевдофункция Inc(pPixel,1) как раз будет увеличивать значение указателя ровно на 3 байта. Правильно я понимаю? А вот как работает Pointer(pLine) - не могу понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:05 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_Федор, можешь краем глаза глянуть мои старые статьи: http://www.makhaon.com/articles/?tag=oeacaoaee ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:08 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Федор_Федор, странная у вас книжка, может там всё же как-то по другому написано? вообще синоним-функция называется Addr Про Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает... Руслан, книжка у меня есть, В. Фаронов "Система программирования Делфи". Там нет ни слова про функцию Pointer(X). Pointer - это зарезервированное слово для нетипизированного указателя. И все... То же говорил встроенная справка. Но при этом компилятор Делфи не ругается на строку типа A:=Pointer(B). Хм... Сейчас еще раз перечитал то, что удалось найти в Инете: "...Таким образом, адрес первого байта, начиная с которого расположен массив символов строки, можно получить просто прочитав числовое значение, хранящееся в S: Pointer(S) или Integer(S). " ( http://www.cyberforum.ru/delphi/thread289886.html). Буду думать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:13 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорПро Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает... Это не функция, потому ничего не возвращает. https://ru.wikipedia.org/wiki/Приведение_типа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:15 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
makhaon, Спасибо! На эти не натыкался. Сейчас изучу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:15 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
makhaon, Изучил, спасибо. Но про функцию Pointer(x) не нашел ничего... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:22 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
wadmanФедор_ФедорПро Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает... Это не функция, потому ничего не возвращает. https://ru.wikipedia.org/wiki/Приведение_типа А разве функция не возвращает преобразованное значение? Я так понимаю, что функция pByte(pUntyped) возвращает указатель типа pByte с тем же значением, что у исходного нетипизированного указателя pUntyped. Я не понимаю, что делает функция Pointer(pUntyped). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:27 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Да не функция это. Это имя типа. Такое же как Integer, String, Byte, TObject, TForm, IInterface и д.р. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:28 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорЯ не понимаю, что делает функция Pointer(pUntyped). Это не функция. Это приведение типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:29 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:31 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
ФедорЯ не понимаю, что делает функция Pointer(pUntyped) Любое преобразование типов (и Pointer(что-то) в том числе) не делает НИЧЕГО . Она вообще не попадает в скомпилированный машинный код. Эта конструкция лишь сообщает компилятору, что с приводимым выражением нужно обращаться как с данными иного (указанного) типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:35 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
GunSmoker, Спасибо! А это вы писали? Я читал. Не всё осилил, (в конце сложности пошли), но эти статьи - одни из лучших. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:49 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
GunSmokerФедорЯ не понимаю, что делает функция Pointer(pUntyped) Любое преобразование типов (и Pointer(что-то) в том числе) не делает НИЧЕГО . Она вообще не попадает в скомпилированный машинный код. Эта конструкция лишь сообщает компилятору, что с приводимым выражением нужно обращаться как с данными иного (указанного) типа. Погодите, я не такой шустрый... Итак, допустим, у меня есть переменная i типа Integer. i:=2018; И пусть я указал в разделе var, что p:pointer. Ок. Если я напишу вот так p:=pointer(i), то что происходит в памяти? 4 байта, которые занимала переменная i, теперь рассматриваются и как переменная i типа Integer, и как указатель p? Тогда понятно, почему Integer(p) выдает значение 2018. (Если эти 4 байта рассматриваются как указатель p, то их содержимое (число 2018) - это адрес ячейки на которую указывает указатель p). Правильно я понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:01 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
GunSmoker, pPixel := Pointer(pLine); pLine - это 4-байтное число, но компилятор (или кто там...) помнит, что pLine - это указатель на данные страшного размера. pPixel - это тоже самое 4-байтное число, но компилятор помнит, что pPixel - это указатель на данные 3-байтного размера. Получается, в моем случае, "функция-нефункция" Pointer просто убиВает скрытую информацию о типе указателя pLine и тупо подпихивает четырехбайтный адрес указателю pPixel. Коряво написал, но пока я вот так понял... Опять не то? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:09 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Федор_Федор, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:12 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
DarkMasterФедор_Федор, Код: pascal 1. 2. 3. Я то же самое (как мне кажется) чуть выше написал. Значит, начинаю потихоньку "врубаться". Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:16 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
ФедорЕсли я напишу вот так p:=pointer(i), то что происходит в памяти? 4 байта, которые занимала переменная i, теперь рассматриваются и как переменная i типа Integer, и как указатель p? Тогда понятно, почему Integer(p) выдает значение 2018. (Если эти 4 байта рассматриваются как указатель p, то их содержимое (число 2018) - это адрес ячейки на которую указывает указатель p). Правильно я понимаю? Правильно. ФедорpLine - это 4-байтное число, но компилятор (или кто там...) помнит, что pLine - это указатель на данные страшного размера. pPixel - это тоже самое 4-байтное число, но компилятор помнит, что pPixel - это указатель на данные 3-байтного размера. Получается, в моем случае, "функция-нефункция" Pointer просто убиВает скрытую информацию о типе указателя pLine и тупо подпихивает четырехбайтный адрес указателю pPixel. Коряво написал, но пока я вот так понял... Опять не то? :-) Правильно. Только надо понимать, что вместо нетипизированного Pointer с равным успехом может стоять и типизированный PInteger, PLine, PPixel: Код: pascal 1. 2. 3. 4. 5. (пример практического смысла не имеет) Ещё раз: Pointer - это просто имя типа. Такого же как Integer, PInteger, String, TObject и так далее. Посмотрите ещё опцию "Type-checked pointers": http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiling http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Type-checked_pointers_(Delphi) http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Pointers_and_Pointer_Types_(Delphi)#Type-checked_Pointers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:24 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
GunSmoker... Правильно. ... Правильно. Только надо понимать, что вместо нетипизированного Pointer с равным успехом может стоять и типизированный PInteger, PLine, PPixel: ... Посмотрите ещё опцию "Type-checked pointers": http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiling http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Type-checked_pointers_(Delphi) http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Pointers_and_Pointer_Types_(Delphi)#Type-checked_Pointers Ура. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 13:56 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
Извините за оффтоп.... Но автор создавал темы с 2006 года по 2018 год... Прошло 12 лет..... Указатели... "функция" Ponter. Я что-то не догоняю? Кстати, забавно наблюдать, что иногда на такие вопросы отправляют курить матчасть, а иногда разжевывают... В целом радужно, когда именно разжевывают... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 18:33 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
X-Cite> Но автор создавал темы с 2006 года по 2018 год... > Прошло 12 лет..... Указатели... "функция" Ponter. Я что-то не догоняю? Скорее всего, человек просто не проф.разработчик, а какой-то "прикладник" или теоретик - например, ваяет "ПО" в каком-нибудь НИИ или КБ. > Кстати, забавно наблюдать, что иногда на такие вопросы > отправляют курить матчасть, а иногда разжевывают... > В целом радужно, когда именно разжевывают... Продолжайте помогать разжевывать. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 18:47 |
|
||
|
Функция "pointer" возвращает какую-то ерунду...
|
|||
|---|---|---|---|
|
#18+
GunSmoker, Появился еще один вопрос. Теоретический. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Вопрос. Почему, если вместо строки "pI:pInteger;" в разделе описания переменных (Var) указать "pI:^Integer;", то компилятор ругает строку кода "pI:=pInteger(p);" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39722017&tid=2040227]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 508ms |

| 0 / 0 |
