привет у меня и вопрос и Исходник: 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 или от хорошего иходника написанного ни Си
Приветствую Вас, _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.