Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Отрицательный адрес памяти  (Прочитано 1013 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн S0rcerer

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Отрицательный адрес памяти
« : 02 Апреля 2011, 23:49:26 »
Вот в общем какой вопрос
Работаю в Lazarus ( Free Pascal )
нужно обратиться к указателю на переменную через его адрес, а теперь НО
New(Point);
  writeln(integer(Point));
выводит отрицательный адрес памяти, но это не самое обидное
Самое обидное что после  операции Point:=pointer(integer(Point));  Point  уже указывает на другое место в памяти, хотя его integer (Point) остается прежним

Проблему можно решить сделав так
New(Point);
Point:=pointer(abs(integer(Point)));

  writeln(integer(Point));

Но после этого как понятно у Point отсутствует зарезервированное место в памяти
В общем у кого какие мысли, давайте обсудим... Я бы написал на форуме Lazarus или FreePascal , но на Windows с той же сборкой Lazarus все норм

Оффлайн Ururu_2

  • Активист
  • *
  • Сообщений: 291
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #1 : 03 Апреля 2011, 00:04:56 »
Подозреваю, что выводится отнюдь не "отрицательный адрес памяти", а вполне нормальный. Как по-твоему определяется, отрицательное ли число в integer? Скорее всего, просто всё, что меньше определённого значения - считается отрицательным. Соответственно, просто адрес оказался меньше "порога" и integer(point) выдало отрицательное число. А в винде адрес просто оказался больше (системы разные и адресация разная) - и integer(point) выдало положительное число.

Оффлайн shumtest

  • Активист
  • *
  • Сообщений: 731
  • Это вам просто кажется...
    • Просмотр профиля
    • Блог Шумомера
Re: Отрицательный адрес памяти
« Ответ #2 : 03 Апреля 2011, 07:53:32 »
Почти так, только с точностью до наоборот :) Старший бит используется для отрицательных чисел.
А по указателю - там надо выводить или как unsigned или как longint

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #3 : 03 Апреля 2011, 07:58:34 »
А зачем указатель приводить к типу integer?
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн S0rcerer

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #4 : 03 Апреля 2011, 10:08:37 »
Спасибо за ответы!
Изменение типа к Longint результата не дало.Плюс integer(Point) = longint(Point) , значит адрес помещается и в integer.
с unsign попробую. А вообще все это мне нужно для реализации Xor-связанного списка

Пользователь решил продолжить мысль 03 Апреля 2011, 10:13:57:
pointer(word(Point)) тоже не помогло
« Последнее редактирование: 03 Апреля 2011, 10:13:57 от S0rcerer »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #5 : 03 Апреля 2011, 10:53:41 »
указатель это указатель и не надо указатели приводить к целым числам. вы себе яму роете.
Внимательно читаем
http://www.viva64.com/ru/a/0050/
http://www.viva64.com/ru/t/0041/

Оффлайн Alexx2000

  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Double Commander
Re: Отрицательный адрес памяти
« Ответ #6 : 03 Апреля 2011, 11:11:01 »
В FreePascal есть два типа, которые имеют размерность аналогичную указателю:
PtrInt - знаковый целочисленный тип
PtrUInt - беззнаковый целочисленный тип
Соответственно можно написать так:
Pointer(PtrUInt(Point))

Оффлайн S0rcerer

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #7 : 03 Апреля 2011, 16:47:22 »
Yurror, Alexx2000 огромное спасибо!
Как то не подумал что Windows у меня стоит на i386, и проблема может быть в этом

Ещё раз спасибо.Тему можно закрывать

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Отрицательный адрес памяти
« Ответ #8 : 04 Апреля 2011, 06:36:32 »
Да пожалуйста. Сам открыл - сам закрывай. Так можно делать.

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.