реклама на сайте
подробности

 
 
> Delphi, pointers.
hadrov
сообщение Jan 15 2009, 10:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 11-11-08
Пользователь №: 41 540



Из хелпа Дельфи:

Код
Character-pointer operators
Operator    Operation    Operand types    Result type    Example
+    pointer addition    character pointer, integer    character pointer    P + I
...

You can use the + and - operators to increment and decrement the offset of a character pointer. You can also use - to calculate the difference between the offsets of two character pointers. The following rules apply.

If I is an integer and P is a character pointer, then P + I adds I to the address given by P; that is, it returns a pointer to the address I
characters after P.


Делаю инкремент указателя через inc() - все нормально, а вот если просто прибавлять смещение к указателю ругается "[Error]...: Operator not applicable to this operand type".

Проверяю на таком примере:
Код
    p   : ^char;
    str : string[5];

begin
    str := 'abc';
    p := @str;
    p := p + 1; // <--


Как заставить указатель указывать на другое место в памяти используя смещение?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
plombir
сообщение Jan 15 2009, 12:39
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Используйте PChar.
Код
var
    p : PChar;
    str : string[50];
begin
    str := 'abcdefghigklmnoprstu';
    p := @str;
    p := p + 9; // <--
    ShowMessage(p^);
Go to the top of the page
 
+Quote Post
hadrov
сообщение Jan 15 2009, 13:24
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 11-11-08
Пользователь №: 41 540



Забыл, что для inc() есть второй параметр, т.е.
Код
var
    p   : ^byte;
    arr : array[1..5] of byte;

begin
    // init arr
    // ...

    p := @arr;
    inc(p, 2);
    ShowMessage(IntToStr(p^)); // покажет трейтий элемент arr


2plombir
Спасибо, натолкнули на мысль:
pchar(p) := pchar(p) + 2;

Жаль, нельзя просто прибавить оффсет, как в Си. sad.gif

Сообщение отредактировал hadrov - Jan 15 2009, 13:31
Go to the top of the page
 
+Quote Post
DSIoffe
сообщение Jan 15 2009, 13:32
Сообщение #4


Дима
*****

Группа: Свой
Сообщений: 1 683
Регистрация: 15-12-04
Из: Санкт-Петербург
Пользователь №: 1 486



Я вот так делал:
var p: pointer;
.....
p := pointer(longint(p)+1);

Разбирайтесь скорее, а то набегут сишники и станут требовать всё бросить и уйти на С...


--------------------
© CОПЫРИГХТ: Дмитрий Иоффе, Советский Союз.
Приглашаю посмотреть: http://muradowa.spb.ru/ и http://www.drtata.narod.ru/index.html
Go to the top of the page
 
+Quote Post
hadrov
сообщение Jan 15 2009, 14:02
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 11-11-08
Пользователь №: 41 540



Да, с pointer красивей, чем приведение типа слева от присваивания - pchar(p) := pchar(p) + 2;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 01:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016