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

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

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

 
 Ответить  Открыть новую тему 
> адрес указателя, вызвать ошибку..
сообщение
Сообщение #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 -


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


Гость






ad:=Integer(Addr(p));

(только если ты уверен, что SizeOf(Pointer) = SizeOf(Integer) на твоем компиляторе)

Добавлено через 1 мин.
Только вот сдается мне, что ты получишь Access Violation wink.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


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

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

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


Цитата(volvo @ 27.05.2007 14:08) *
ad:=Integer(Addr(p));
(только если ты уверен, что SizeOf(Pointer) = SizeOf(Integer) на твоем компиляторе)
как я понимаю SizeOf(Integer)=2 байта, а вот SizeOf(Pointer) = 2 или 4... но тогда можна было бы использовать longint, так все равно ошибка

Цитата(volvo @ 27.05.2007 14:08) *
Только вот сдается мне, что ты получишь Access Violation wink.gif
узнаем smile.gif

ЗЫ компилятор FPC.

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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Что значит "все равно ошибка"? То, что я привел прекрасно компилируется в FPC - уточняй, где и какая ошибка возникает у тебя...

Цитата
как я понимаю SizeOf(Integer)=2 байта
только не для FPC ...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


Цитата(volvo @ 27.05.2007 14:23) *
Что значит "все равно ошибка"?
прости, предупреждение..

Цитата(volvo @ 27.05.2007 14:23) *
только не для FPC ...
а сколько тут?

и еще сможем ли мы удалить файл созданный другой программой до закрытия первой(но закрывая файл). и почему не получается читать с файла?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
а сколько тут?

WriteLn(SizeOf(Integer)); { <--- Мне выдает 4 }


Если честно - я не совсем понял смысл того, что ты хочешь сделать (я имею в виду, зачем тебе это пригодится?) - из одного процесса хочешь получить доступ к адресному пространству другого процесса? Тогда см. DRKB, там по-моему описано, как это делать... Просто так это у тебя не получится, я ж говорил тебе что ты получаешь AV.

Добавлено через 1 мин.
P.S.
А ошибку распределения памяти можно вызвать (RunError + номер ошибки), а не создавать искусственно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


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

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

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


Цитата(volvo @ 27.05.2007 15:53) *
WriteLn(SizeOf(Integer)); { <--- Мне выдает 4 }
blink.gif а мне 2 blink.gif , а вот для LongInt - 4... надо будет наверно спросить на форуме FP.. и создать тему в 32 битных компиляторах что б другии люди тоже по тестировали. Что думаешь?


Цитата(volvo @ 27.05.2007 15:53) *
Если честно - я не совсем понял смысл того, что ты хочешь сделать ... Просто так это у тебя не получится, я ж говорил тебе что ты получаешь AV.
что б больше такое не писать smile.gif
Цитата(volvo @ 27.05.2007 15:53) *
А ошибку распределения памяти можно вызвать (RunError + номер ошибки), а не создавать искусственно.
а по подробнее можна...

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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ничего не надо спрашивать... Я и так тебе скажу: это зависит от {$mode} или Options -> Compiler -> (вкладка) Syntax -> Compiler mode... Если там стоит "Turbo Pascal compatible" - то будет двухбайтовое целое, если Delphi/FPC - то четырехбайтовое...

А подробнее - процедура RunError как раз и используется для отладки реакции программы на ошибки: после ее вызова программа ведет себя так, как будто в ней произошла ошибка с заданным номером - чтобы проверить, как программа себя поведет, когда ей реально встретится такая ошибка...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


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

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

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


Цитата(volvo @ 27.05.2007 16:51) *

Ничего не надо спрашивать... Я и так тебе скажу: это зависит от {$mode} или Options -> Compiler -> (вкладка) Syntax -> Compiler mode... Если там стоит "Turbo Pascal compatible" - то будет двухбайтовое целое, если Delphi/FPC - то четырехбайтовое...
При Delphi действительно 4, но при TPC/FPC -2 и 4 (Integer и LongInt)...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Не знаю, мне при {$mode ObjFPC} тоже дает SizeOf(Integer) = 4 ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


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

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

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


Цитата(volvo @ 27.05.2007 17:14) *
Не знаю, мне при {$mode ObjFPC} тоже дает SizeOf(Integer) = 4 ...
в руководстве сказано size 2,4 or 8...(Free Pascal > Reference guide.> Chapter 3 >Types 3.1.1 >Ordinal types) а вот от чего это зависит?...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата(prog.pdf)
Appendix D

D.3 Delphi mode
...
5. The Objpas unit is loaded right after the system unit. One of the consequences of this is that
the type Integer is redefined as Longint.
...

D.5 ObjFPC mode
...
5. The Objpas unit is loaded right after the system unit. One of the consequences of this is that the type Integer is redefined as Longint.
...
Во всех остальных случаях размеры Integer и LongInt НЕ совпадают...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


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

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

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


размер Pointer, как я теперь понял 4 поэтому буду использовать LongInt...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


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

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

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


а как присвоить адрес указателю?
var
p : ^longint; //указатель
f :file of longint; //файл
l:longint; //число
begin
Assign(f,'file.txt');//связываем файл с переменной
Reset(f); //откпываем файл

New(p); //инициализация

read(f, l); //читаем адрес сфайла
p:=@l; //должно быть присваевыванние указателю адрес(уже понял-забыл @ )
write(l);
Erase(f); //удаляем файл
readln;
read;
end.


а вот моя главная программа
var
p : ^longint;
ad: longint;
f :file of longint;
begin
Assign(f,'file.txt');
Rewrite(f);

New(p);
readln(p^);

ad:=longint(Addr(p));
write(f, ad);

Close(f);
{$I-}
while IOResult = 0
do Reset(f);
{$I+}
writeln(p^);

readln;
read;
end.


только как-то не так работает... вместо числа введенного в первой программе , вторая печатает каккуету стрелочку...

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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






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

Ну, допустим, вначале запускается программа, СОЗДАЮЩАЯ файл... Хорошо, запустил я ее... Ввел число... Что дальше происходит, ты подумал? Что ты пишешь в файл? Указатель на указатель на 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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


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

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

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


Цитата(volvo @ 27.05.2007 21:48) *
Ты можешь мне объяснить, ЧЕГО ты хочешь добиться??? (словами, без этого бреда, который ты тут написал?)
ошибку!!!
Цитата(volvo @ 27.05.2007 21:48) *
пока вторая программа его не удалит?
тут проблема что он не удаляется ибо открыт на запись, но вторая программа считает что он удален(!)
Цитата(volvo @ 27.05.2007 21:48) *
Но вся эта цепочка, которую ты задумал, прервется гораздо раньше - по Access Denied при попытке открытия файла, занятого другим приложением.
У меня пока ошибка не прявляется...

Цитата(volvo @ 27.05.2007 21:48) *
У тебя еще есть желание продолжать эти изыскания? rolleyes.gif
пока не прпало smile.gif


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






собственно подозрительный этот кусок,
{$I-}
while IOResult = 0
do Reset(f);
{$I+}
ведь ошибка может возникнуть не потому что нету файла, а потому что отказанно в доступе... надо бы придумать другой способ проверять наличие файла...
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 1.10.2020 19:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name