Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Как в Delphi переменной присвоить определённый адрес ячейки что-бы иметь к ней постоянный доступ?
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 14:12
· Личное сообщение · #1

Как в Delphi присвоить переменной адрес ячейки что-бы иметь к ней постоянный доступ?
Например некое значение (один байт) лежит по адресу $404012. Я могу его читать и писать подобным образом:

byte(pointer($404012)^):=$10;
либо
x:=byte(pointer($404012)^);

В подобном случае происходит постоянное чтение и конвертация, да и это не наглядно. Другое дело если объявить переменную например Х размером в байт, но так, что-бы её адрес в памяти фактически оказался нужным мне, а не тем, что выделит дельфи. Тогда делая if X=$12... всё будет происходить очень просто и в Х всегда будет свежее значение...
Как такое реализовать?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июня 2009 14:24
· Личное сообщение · #2

Выдели глобальную переменную, да возьми где-нить в начале её адрес, вот и будет указатель на постоянную переменную.
З.Ы. Вопрос сформулирован криво, не совсем понял, что надо.
З.З.Ы. Может, всё же опишешь изначальную задачу, что надо сделать, а не финт ушами этот?




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 13 июня 2009 14:36
· Личное сообщение · #3

Сам пишу на С++, но когда-то позавидовал такой возможности в Делфи.

Помоему реализуется так

var
X : Byte absolute $404012;

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 июня 2009 16:03 · Поправил: BoRoV
· Личное сообщение · #4

объяви глобальную переменую типа PByte(просто ты в своем примере привел операцию с байтом)

-----
Лучше быть одиноким, но свободным © $me





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 17:18 · Поправил: ToBad
· Личное сообщение · #5

Простите, что не корректно описал проблему. Сообщение OKOB в точности иллюстрирует то, чего хочу добиться:
Var X: Byte absolute $404012;

У меня Дельфи7, пока не разобрался как заставить работать эту конструкцию. Ошибку выдаёт: "Variable name expected" указывая на адрес.

На данный момент получилось сделать только так, как посоветовал BoRoV:
Var X:PByte;
X:=pointer($404012);
Далее пишем и читаем так:
X^:=$12;
a:=X^;

Конечно вариант с absolute был бы вообще идеален... Буду гуглить.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 17:30 · Поправил: ToBad
· Личное сообщение · #6

Нашёл такой код:

var
BiosDate: array[0..7] of char absolute $FFFF5;
PCType: byte absolute $FFFFE;

procedure TForm1.FormCreate(Sender: TObject);
var
S: string;
begin
case PCType of
$FC: S := 'AT';
$FD: S := 'PCjr';
$FE: S := 'XT =8-O';
$FF: S := 'PC';
else
S := 'Нестандартный';
end;
Caption := 'Дата BIOS: ' + BiosDate + ' Тип ПК: ' + S;
end;

Всё равно при компиляции ругается на адрес. Может какая-то директива компилятора нужна?



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 июня 2009 18:36
· Личное сообщение · #7

ToBad
поройся вот тут
forum.vingrad.ru/forum/topic-241111.html




Ранг: 260.3 (наставник), 2thx
Активность: 0.120
Статус: Участник
PPC-PROTECT author

Создано: 13 июня 2009 18:53
· Личное сообщение · #8

откуда у программиста может возникнуть такая задача знать точный адрес переменной?

-----
Пиво, сиськи, транс





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 19:32
· Личное сообщение · #9

tihiy_grom пишет:
поройся вот тут


Порылся, указать конкретный адрес не удается. Absolute почему-то принимает только имя переменной, но никак не конкретный адрес как в примере.


-= ALEX =- пишет:
откуда у программиста может возникнуть такая задача знать точный адрес переменной?


Например обращаться из dll к переменным вызывающей программы, обмен данными и т.д. Мало ли ещё где пригодится...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 июня 2009 20:08
· Личное сообщение · #10

ToBad пишет:
Порылся, указать конкретный адрес не удается. Absolute почему-то принимает только имя переменной, но никак не конкретный адрес как в примере.

вообще-то так и должно быть, ибо
ToBad пишет:
Ошибку выдаёт: "Variable name expected"

то есть "ожидается имя переменной"




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 20:44
· Личное сообщение · #11

tihiy_grom не пойму тогда этот код, на чём его компилировали? Может есть директива компилятора какая-то хитрая...

var
BiosDate: array[0..7] of char absolute $FFFF5;
PCType: byte absolute $FFFFE;

procedure TForm1.FormCreate(Sender: TObject);
var
S: string;
begin
case PCType of
$FC: S := 'AT';
$FD: S := 'PCjr';
$FE: S := 'XT =8-O';
$FF: S := 'PC';
else
S := 'Нестандартный';
end;
Caption := 'Дата BIOS: ' + BiosDate + ' Тип ПК: ' + S;
end;



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 июня 2009 21:08
· Личное сообщение · #12

это скорее всего можно скомпилировать только на старых версиях дэлфи

www.k-press.ru/cs/2002/3/delp/delp.asp
смотри таблицу 2




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 22:09
· Личное сообщение · #13

tihiy_grom пишет:
это скорее всего можно скомпилировать только на старых версиях дэлфи


Я думаю с указанием конкретного адреса это синтаксис Object Pascal...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 июня 2009 22:22
· Личное сообщение · #14

возможно
у меня его под рукой нет чтобы проверить




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 июня 2009 23:14
· Личное сообщение · #15

tihiy_grom пишет:
у меня его под рукой нет чтобы проверить


И у меня...

Пока остановился на:
Var X:PByte;
X:=pointer($404012);
X^:=$12;
a:=X^;

Не буду закрывать пока тему, подожду пару дней, может кто знает и отпишется.




Ранг: 260.3 (наставник), 2thx
Активность: 0.120
Статус: Участник
PPC-PROTECT author

Создано: 14 июня 2009 09:53
· Личное сообщение · #16

ToBad используй шаред мемори)

-----
Пиво, сиськи, транс




Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2009 14:05
· Личное сообщение · #17

а почему бы сразу не использовать PByte($404012)^:=$12; ?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 08 сентября 2009 15:05
· Личное сообщение · #18

Не стоит больше поднимать топики давностью в 3 месяца.


 eXeL@B —› Программирование —› Как в Delphi переменной присвоить определённый адрес ячейки что-бы иметь к ней постоянный доступ?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати