Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 136
от 16.05.2003, 15:00

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 231
Отправлено ответов: 748
Активность: 323.8 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Tancho
Статус: Опытный
Общий рейтинг: 150.3
[Подробней >>]
Sensey
Статус: Профессиональный
Общий рейтинг: 121.71
URL: Страничка рассылки по Паскалю
Телефон: +38 (0572) 41-76-04 д.
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 119.09
[Подробней >>]
 
Bill
Статус: Начальный
Общий рейтинг: 187.5
[Подробней >>]
_vt
Статус: Доверительный
Общий рейтинг: 120.9
[Подробней >>]
joe
Статус: Начальный
Общий рейтинг: 118.18
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 225. привет у меня и вопрос и Исходник: var i,j: ^integer; r:^real; begin new(i ); j:=i; что это значит и... (ответов: 6)

Вопросов: 1, ответов: 6


 Вопрос № 225

привет
у меня и вопрос и Исходник:
var
i,j: ^integer;
r:^real;
begin
new(i );
j:=i; что это значит и зачем это - по подробнее обьясните пожалуйста
j^:=2; т е это число размещённое по этому указателю и оно(это число ) имеет свой физический адрес - это так или нет
dispose( i); возвращение dinamic memory
new( r); сново размещение dinamic memory
r^:=pi; понятно
writeln(j^ );т к у нас j это 2 (а почему оно не стёрлось - обьясните)то что дальше и почему ответ 8578
P.S. - после того как по адресу R разместилось pi то ПЕРВЫЕ ДВА БАЙТА КУЧИ ОКАЗАЛИСЬ ЗАНЯТЫ ПОД ЧАСТЬ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ ЭТОГО ЧИСЛА - ИЗВИНИте но нифига не понял - обьясните
2 вопрос - За счёт чего происходит быстрая компиляция - от CPU или от хорошего иходника написанного ни Си



Вопрос отправлен: 13.05.2003, 14:12
Отправитель: _hf (_hf@tut.by)

[Следующий вопрос >>] [Список вопросов]

Отвечает Tancho

Приветствую Вас, _hf!
...
j := i; Это значить что адрес указателя i становиться и
адрес указателя j;
j^ := 2; по етому адресу размещается 2;
dispose(i); Освобождает память разположена по адреси указатели i и j;
new(r); выделяеть память для динамическая променлива r, но так как тип указателя r реалный, для r выделяеться 4 байта, освободенные 2 и есчо 2;
...
writeln(j^) на екран выдаеться часть из памяти где разположено pi и оно интерпретируеться как целое, что и даеть 8587;
Смотри приложение! Здесь я сложиль dispose(i) в коментарий и
уже writeln(j^) даеть 2, как и надо.

Приложение:

Ответ отправлен: 15.05.2003, 16:13
Отправитель: Tancho


Отвечает Sensey

Приветствую Вас, _hf!
new(i ); в куче выделилось 2 байта под ЗНАЧЕНИЕ переменной i^, в i записан адрес, где выделилась память
j:=i; теперь i и j ссылаются на один и тот же адрес
j^:=2; присваивание значения. i^=j^=2;
dispose( i); блок помечен как свободный, и ВОЗМОЖНО при следующем выделении памяти занятся чем либо... i<>nil но данные недостоверны
new( r); и вот здесь под r^ выделяется тот же блок памяти
r^:=pi; как-то заполняется
writeln(j^ ); и вот здесь выводится значение по адресу, но само значение уже изменилось изза присваивания r^:=pi
После того как по адресу R разместилось pi то ПЕРВЫЕ ДВА БАЙТА КУЧИ ОКАЗАЛИСЬ ЗАНЯТЫ ПОД ЧАСТЬ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ ЭТОГО ЧИСЛА - под r^ выделилось 6 байт, а i и j тоже указывают на этот адрес, но разадресация - только 2 байта(размер integer).
Ты эту прогу по шагам прогони, заодно наблюдая значения переменных i j r i^ j^ r^ (в Watch-окне)
Может мой вариант будет понятнее


Приложение:

Ответ отправлен: 13.05.2003, 14:52
Отправитель: Sensey


Отвечает Ayl

Приветствую Вас, _hf!
Объясняю по строкам со значениями, полученными в моем отладчике.
new(i ); - выделить память под переменную целого типа (i = Ptr($2367,0), i^ = неопределено)
j:=i; - приравниваем указатели, теперь и i, и j ссылаются на один и тот же адрес памяти: j = Ptr ($2367,0)
j^:=2; - заносим по адресу Ptr ($2367,0) значение 2 (целое, 2 байта) (i = j = Ptr ($2367,0), i^ = j^ = 2)
dispose(i); - уничтожаем значение переменной i и возвращаем соответствующий адрес в memory pool
new(r); - выделяем память под переменную типа real (6 байт) (r = Ptr ($2367,0), r^ = неопределено, j^ = 2 (ну, типа 2-ка все еще реально расположена по этому адресу))
r^:=pi; - записываем число Пи в выделенную память. Вещественное число занимает 6 байт, а т.к. адрес памяти совпадает со значением переменной j, то теперь j ссылается на первые 2 байта 6-тибайтового представления числа Пи. В этом месте прогаммы:
i = j = r = Ptr ($2367,0);
i^ = j^ = 8578 (ну вот такое значение имеют первые 2 байта числа Пи);
r^ = 3.1415926536;
writeln(j^); - ну, выводим, собственно... Результат - 8578.
2-й вопрос что-то непонятен...

Ответ отправлен: 13.05.2003, 15:04
Отправитель: Ayl


Отвечает Bill

Доброе время суток, _hf!
Луший способ понять самому - использовать отладчик BP ( или TP). Кстати под Windows
надежнее работает Borland Pascal.
1) Загружаешь программу;
2) Просишь показывать значения
-i
- j
- r
- j^,10m
- r^
То есть, нажимаешь Ctrl+F7, в появившемся окне Watches набираешь "i", не выходя из окна,
нажимаешь "Insert", пишешь "j", "r", и т. д. "j^,10m" - обозначает: показывать область памяти, на которую
указывает j, показать 10 байт.
И начинаешь пошаговое выполнение программы, не выходя из окна Watches, нажимая клавишу F8.
Теперь о том, что происходит:
New(i); занял память под i;
j:=i; Сам увидишь - j указывает на ту же ячейку памяти;
Dispose(i) - ясно, но обрати внимание, что j по-прежнему указывает на ту же область памяти, что и раньше!
Однако, система знает, что данная область памяти свободна, и по-этому r, после New(r), разместится в той же
области памяти! Теперь два указателя указывают на одну и ту же область памяти, что увидишь сам.
Далее, после r^:=pi, увидишь, что r^ - "правильно" показывает, а j^ - нет. На самом деле и j показывает
правильно, но это внутреннее представление числа типа REAL в памяти компьютера. Сам увидишь эти
85 78, но в 16-ричном представлении.
----
О втором вопросе: отвечу по-иному. Паскаль написан на ассемблере и как компилятор, то есть из
исходного кода (текста, что Вы написали) сразу и быстро делает .EXE - файл. С, С++ работает по иному, он транслятор.
Это значит, что сначала исходной текст транслируется (переводится) на машинный язык. Получается
объектный модуль (.OBJ). А затем из таких объектных модулей собирается (линкуется, компилируется)
исполняемый файл. Эта схема работает дольше, но появляются дополнительные возможности.
Хороший исходник - всегда хорошо, но с точки зрения скорости получения исполняемого файла - это доли секунды

Ответ отправлен: 13.05.2003, 18:19
Отправитель: Bill


Отвечает _vt

Доброе время суток, _hf!
1)Уже не первый вопрос от вас по этой теме, прогресса не видать... Ну что-ж, постараюсь понятно объяснить в приложении.
P. S. В книге откуда взят этот пример всё подробно объяснено , я сам по ней учился, сразу узнал...
2)Если я правильно понял вопрос, то скорость компиляции зависит от компилятора.(Что в вашем понимании быстрая компиляция, хороший исходник и причем здесь Си...)

Приложение:

Ответ отправлен: 13.05.2003, 23:18
Отправитель: _vt


Отвечает joe

Добрый день, _hf!
j:=i; //теперь i и j ссылаются на один и тот же адрес, т.е. что потом присвоится оператором j^:=??? не важно..., а writeln(j^) вывел содержимое ячейки памяти с адресом, по которому находилось содержимое переменной i, т.е. одному богу известно, что.


Ответ отправлен: 14.05.2003, 07:30
Отправитель: joe



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (40)
C / C++ (30)
Perl (4)
Builder / Delphi (16)
Pascal (31)
Basic / VBA (12)
Java / JavaScript (11)
PHP (5)
MySQL / MSSQL (4)
Пользователю
Windows 95/98/Me (41)
Windows NT/2000/XP (30)
"Железо" (29)
Поиск информации (14)
Администратору
Windows NT/2000/XP (19)
Linux / Unix (9)
Юристу
Гражданское право (7)
Семейное право (4)
Трудовое право (5)
КоАП (4)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование


Яндекс цитирования
© 2003 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное