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

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

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

> динамические структуры данных, указатели+массив..
compiler
сообщение 19.05.2007 18:05
Сообщение #1


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

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

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


Добрый день, помогите разобраться с указателями..
необходимо.Компонентам массива целых присваиваются сдвинутые на 65 значения индекса, печатается массив целых. Переменной-указателю на символьный массив присваивается адрес массива целых. Снова распечатывается массив, но по адресам значений. Вместо последовательности чисел будет напечатана последовательность ASCII символов от А до z с пробелами.
собственно есть текст проги, но мне он не ясен помогите пожалуйста..
а вот текст..
Program ReInterpretation;	
Uses Crt;
Type
A = Array [0..99] of char;
Var
X : Array [0..49] of integer;
pA : ^A;
i : integer;
Begin
ClrScr;
for i := 0 to 49 do begin
X[i] := 65+i;
write(X[i], ' ');
End;

pA := @X;

writeln;

for i := 0 to 99 do
write(pA^[i],' ');

readln;
read;
End.

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



Добавлено через 2 мин.
вроде все стало ясно... прошу прощение что побеспокоил..


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
compiler
сообщение 19.05.2007 19:09
Сообщение #2


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

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

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


собственно задача из <<той же серии>>...

Uses
Crt;
Var
P : pointer;

Procedure Test(p: pointer);
Begin
p := @P; {Определение адреса локального параметра}
writeln ('', Seg(p^), ':', Ofs(p^));
End;

Begin
ClrScr;
Test(P); {Вызов процедуры}
writeln('', Seg(p^), ':', Ofs(p^));
readln;
read;
End.

ее я точно сам не пойму sad.gif



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


Гость






Что именно здесь непонятно? Почему в процедуре печатается ненулевое значение, а в основной программе - нули?
 К началу страницы 
+ Ответить 
compiler
сообщение 19.05.2007 19:16
Сообщение #4


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

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

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


Цитата(volvo @ 19.05.2007 19:13) *
Что именно здесь непонятно? Почему в процедуре печатается ненулевое значение, а в основной программе - нули?
это тоже и где можна прочитать про адресацию подробнее(желательно на русском)


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


Гость






Цитата
где можна прочитать про адресацию подробнее

Здесь:
http://www.klax.tula.ru/~zet/themes/pointers.html
 К началу страницы 
+ Ответить 
compiler
сообщение 19.05.2007 22:14
Сообщение #6


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

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

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


Цитата(volvo @ 19.05.2007 19:24) *
Здесь:
оттуда
const
р: ^real = NIL;
begin
if р = NIL then
new(p);
dispose(p);
p := NIL;
end.


не работает(illegal character "'р'" ($F0)) sad.gif почему?

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


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


Гость






У тебя 2 символа p - в кириллице (в описании и в If ...)

Поменяй на латинские...
 К началу страницы 
+ Ответить 
compiler
сообщение 19.05.2007 22:26
Сообщение #8


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

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

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


Цитата(volvo @ 19.05.2007 22:24) *
Поменяй на латинские...
спасибо...
вечно попадаюсь на эту дурацкую ошибку...


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


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

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

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


а вот еще одна задача оттуда...
program Primer1;
const
SizeOfReal = 6; {Длина переменной типа REAL}
N = 100; {Количество столбцов}
M = 200; {Количество строк}
var
i, j: integer;
PtrStr: array [1..N] of pointer;
s: real;
type
RealPoint = ^real;
{-----------------}
Function AddrR(i,j: word): RealPoint;
{По сегменту i и смещению j выдает адрес вещественной переменной}
begin
AddrR := ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^)+(j-1)*SizeOfReal)
end; {AddrR}
{-----------------}
Function GetR(i,j: integer): real;
{Выдает значение вещественной переменной по сегменту i
и смещению j ее адреса}
begin
GetR := AddrR(i,j)^
end; {GetR}
{-----------------}
Procedure PutR(i,j: integer; x: real);
{Помещает в переменную, адрес которой имеет сегмент i
смещение j, вещественное значение x}
begin
AddrR(i,j)^ := x
end; {PutR}
{-----------------}

begin {Main}
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOfReal);
for j := 1 to M do PutR(i, j, Random)
end;
s := 0;
for i := 1 to N do
for j := 1 to M do
s := s + GetR(i,j);
WriteLn(s / (N * M): 12:10);
end. {Main}

FPC -не компилит, TP-вылетает вовремя исполнения...

добавленно
FAR говорит что необходим параметр какой-то
еще если пытаться запустить из TP то не получится...

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


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


Гость






Свят-свят-свят... Что с тобой? Как это "не компилит"? blink.gif

Function AddrR(i,j: word): RealPoint;
begin
AddrR := RealPoint(ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^)+(j-1)*SizeOfReal))
end;

и все smile.gif
 К началу страницы 
+ Ответить 
compiler
сообщение 20.05.2007 16:43
Сообщение #11


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

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

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


теперь работает(но с предупреждением)...
volvo, не мог бы ты добавить свои подробные коментарии... пожалуйста...


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


Гость






program Primer1;
const
SizeOfReal = 6; {Длина переменной типа REAL}
N = 100;
M = 200;
var
i, j: integer;
PtrStr: array [1..N] of pointer;
s: real;
type
RealPoint = ^real;
{-----------------}
Function AddrR(i,j: word): RealPoint;
// По индексу в массиве указателей i и индексу элемента внутри i-го массива
// выдает адрес вещественной переменной
begin
AddrR := RealPoint(
// "собираем" адрес из сегмента : смещения, где
ptr(
seg(PtrStr[i]^), // сегмент = сегменту области памяти, на которую
// указывает ptrstr[i]
ofs(PtrStr[i]^)+(j-1)*SizeOfReal // смещение = смещению этой же
// области памяти + количеству байт, предшествующих
// элементу с заданным индексом (j)
)
)
end; {AddrR}
{-----------------}
Function GetR(i,j: integer): real;
// Выдает значение вещественной переменной по индексу массива - контейнера
// и номеру элемента в этом массиве
begin
GetR := AddrR(i,j)^
// для того, чтобы получить значение самой переменной достаточно
// просто разыменовать указатель, поскольку он уже приведен к типу
// "указатель на Real" в функции
end; {GetR}
{-----------------}
Procedure PutR(i,j: integer; x: real);
// Помещает в позицию J массива-контейнера I значение X
begin
AddrR(i,j)^ := x
end; {PutR}
{-----------------}

begin {Main}

// Выделяем память для N массивов-контейнеров (каждый - на M элементов типа Real)
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOfReal);
// и заполняем их случайными значениями...
for j := 1 to M do PutR(i, j, Random)
end;

// Ну, дальше я думаю все понятно?
s := 0;
for i := 1 to N do
for j := 1 to M do
s := s + GetR(i,j);
WriteLn(s / (N * M): 12:10);
end. {Main}
 К началу страницы 
+ Ответить 
compiler
сообщение 20.05.2007 17:31
Сообщение #13


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

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

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


спасибо, буду разбираться...

оффтоп но перед этим отдохну... погодка чудная


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


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

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

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


еще вот вопрос по CSEG( Возвращает значение, хранящееся в регистре CS микропроцессора (в начале работы программы в регистре CS содержится сегмент начала кода программы). )...
что надо сделать в программе что б возращался не ноль?


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


Гость






Ты компилируешь в FPC? Тогда ничего не поможет:
Цитата(rtl.pdf)
29.9.37 Cseg
Synopsis: Return code segment
Declaration: function Cseg : Word
Visibility: default
Description: CSeg returns the Code segment register. In Free Pascal, it returns always a zero, since Free Pascal is a 32 bit compiler.
Errors: None.
 К началу страницы 
+ Ответить 
compiler
сообщение 20.05.2007 19:29
Сообщение #16


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

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

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


спасибо...


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


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

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

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


вот есть еще такая программка... по ней пару вопросов...
type
ar=array[0..100000] of longint; //большой массив
Var
j:^char;
i:integer;
a: ^ar; //указатель на наш вектор.
Begin
readln;
read;
new(a); //прыжок по использованию памяти..
for i:=200 to 300 do begin
(*j:=Addr(i);*) j:=@i; //если какая-то разница?
writeln(j^);
end;
readln;
read;
DISPOSE(a); //не замечаем обратного прыжка... почему?
readln;
read;
End.


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


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


Гость






Цитата
(*j:=Addr(i);*)	j:=@i;    //если какая-то разница?
Абсолютно никакой - Addr(X) и @X возвращают адрес объекта X... Вся разница - Addr это функция, а @ - оператор...

Цитата
//не замечаем обратного прыжка... почему?
Это ты о чем? Кстати, что ты думаешь будет делать твоя программа?
 К началу страницы 
+ Ответить 
compiler
сообщение 22.05.2007 17:25
Сообщение #19


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

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

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


Цитата(volvo @ 22.05.2007 16:38) *
Это ты о чем?

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

Цитата(volvo @ 22.05.2007 16:38) *
Кстати, что ты думаешь будет делать твоя программа?
печатать символы и пищеть :) (код 7)..


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


Гость






Цитата
о виртуальной памяти...
А что, твоя программа сама управляет виртуальной памятью? Вообще-то этим должна заниматься OC, вот когда она решит освободить память, тогда и уменьшится размер...
 К началу страницы 
+ Ответить 

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

 



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