IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> адрес указателя, вызвать ошибку..
compiler
сообщение 27.05.2007 14:01
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Хотелось бы написать программку которая вызывала ошибку в распределении памяти...
для этого я хочу написать 3 проги . первая - читает число(в указатель), адрес указателя пишет в файл, ждет действия второй програмки(которая будет пытаться прочитать/изменить значения указателя) и печатает это же число.
первую програмку я то написал но с ошибками
var
p : ^integer;
ad: integer;
f :file of integer;
begin
Assign(f,'file.txt');
Rewrite(f);

New(p);
readln(p^);

ad:=Addr(p); //ошибка, можна конечно прать отдельно сигмент и сдвиг но это не то...
write(f, ad);

Close(f);

(*readln; read;*)
while IOResult = 0 //замена, пока файл не удален другой программой,
do {$I-} Reset(f); {$I+} //будем надеятся у нее это получится


writeln(p^);

readln;
read;
end.


заранее благодарен.

добавлено (вторая программа+в первой уничтожена одна переменная)
var
p : ^integer;
f :file of integer;
begin
Assign(f,'file.txt');
Reset(f);

New(p);
read(f, p);

Erase(f);
end.



Сообщение отредактировано: compiler - 27.05.2007 15:12


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 27.05.2007 21:48
Сообщение #2


Гость






Ты можешь мне объяснить, ЧЕГО ты хочешь добиться??? (словами, без этого бреда, который ты тут написал?)

Ну, допустим, вначале запускается программа, СОЗДАЮЩАЯ файл... Хорошо, запустил я ее... Ввел число... Что дальше происходит, ты подумал? Что ты пишешь в файл? Указатель на указатель на LongInt? Допустим... Только учти, что этот указатель, который ты пишешь - он валиден только в той программе, в которой было выделение памяти. Другая программа - другой процесс, другое адресное пространство...

Хорошо, забудем про это на секунду...

Что ты делаешь дальше (и, соответственно, что должен делать я, чтобы повторить полученный тобой результат?) - закрыл файл... Допустим, это тебе разрешат сделать... Дальше что? Ты переоткрываешь файл, пока он переоткрывается, т.е., по твоей задумке - пока вторая программа его не удалит? А кто ей даст удалить файл, занятый другим процессом, ты не подумал? Ты моментально получишь AccessDenied даже при попытке Reset-а!

Забудем и про это... Теперь, по твоей задумке, я должен запустить вторую программу, так? Которая у тебя почему-то приведена первой (ты бы хоть комментарии оставлял, что запускать когда, здесь не форум телепатов, все-таки). Хорошо, запустил. Дальше что? Прочел из файла значение в переменную L... Ты не забыл, что там записано? Я тебе напомню, указатель на указатель на LongInt. Что ты делаешь с L? Печатаешь его? И что ты хотел получить? Тебе если на то пошло надо печатать вот это:

type
plongint = ^longint;
pplongint = ^plongint;

var
p: plongint;
f: file of longint;
l: longint;
begin
...
read(f, l);
p := pplongint(l)^;
write(p^); // Вот это ты должен печатать !!!
...
end.



Но вся эта цепочка, которую ты задумал, прервется гораздо раньше - по Access Denied при попытке открытия файла, занятого другим приложением.

У тебя еще есть желание продолжать эти изыскания? rolleyes.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме
compiler   адрес указателя   27.05.2007 14:01
volvo   ad:=Integer(Addr(p)); (только если ты уверен, что ...   27.05.2007 14:08
compiler   [code=pas]ad:=Integer(Addr(p));(только если ты уве...   27.05.2007 14:14
volvo   Что значит "все равно ошибка"? То, что я...   27.05.2007 14:23
compiler   Что значит "все равно ошибка"? прости, п...   27.05.2007 14:31
volvo   WriteLn(SizeOf(Integer)); { <--- Мне выдает 4 ...   27.05.2007 15:53
compiler   WriteLn(SizeOf(Integer)); { <--- Мне выдает 4 }...   27.05.2007 16:45
volvo   Ничего не надо спрашивать... Я и так тебе скажу: э...   27.05.2007 16:51
compiler   Ничего не надо спрашивать... Я и так тебе скажу: ...   27.05.2007 17:06
volvo   Не знаю, мне при {$mode ObjFPC} тоже дает Siz...   27.05.2007 17:14
compiler   Не знаю, мне при {$mode ObjFPC} тоже дает Siz...   27.05.2007 17:18
volvo   [b]Appendix D D.3 Delphi mode ... 5. The Objpas u...   27.05.2007 17:37
compiler   размер Pointer, как я теперь понял 4 поэтому буду ...   27.05.2007 17:45
compiler   а как присвоить адрес указателю? var p : ^longin...   27.05.2007 19:20
volvo   Ты можешь мне объяснить, ЧЕГО ты хочешь добиться??...   27.05.2007 21:48
compiler   Ты можешь мне объяснить, ЧЕГО ты хочешь добиться??...   28.05.2007 12:25
-compiler-   собственно подозрительный этот кусок,{$I-} w...   28.05.2007 13:08


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 5:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"